A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 枫叶路过123 中级黑马   /  2014-11-4 00:28  /  656 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


文件操作:
C语言中操作文件,第一步是打开文件,第二步是操作文件,最后一步是关闭文件。
1.fopen(“目录”,“mode”):目录可以是绝对目录,也是当前的工作目录。返回值是FILE*结构。
R :只读,文件必须存在;不可以写入
R+:读写,但是文件必须存在,并且从文件开头写入
A: 追加方式打开,如果文件不存在,就创建一个新文件,否则就在文件末尾追加内容
W: 只写,如果文件存在,将文件内容清零,如果不存在就创建这份文件。如果是以二进制文件读取的,要想换行就得加\r\n。
W+:可读写,存在的话改写文件
RW+:读写
2.fclose(p):关闭文件
3.getc(p): 从打开的文件中一次读取一个字符,并且文件指针自动后移一位,返回值是字符类型。对于一个文件,最后的字符是EOF。回车键也可以读出来,适合读取文本文件,不适合读取二进制文件。
4.putc(c,p):往文件中一次只能写入一个字符c。
5.二进制和文本文件的区别:在windows下,文本模式下,在写入文件的时候,\n会被自动转换为\r\n,实际写入文件的是\r\n,读取的时候\r\n会转换为\n.但是linux下是没有的。二进制模式下的时候,windows下使用\n不能正常换行。
6.EOF和feof(p):EOF适合getc(),feof(p)函数如果到了文件的最后,返回TRUE,使用putc()时会将文件的结尾EOF == -1输出来,这个时候可以加一个判断语句if(c == EOF)退出。
7.fgets(buf,sizeof(buf),p):读取文本文件的一行,不会读到EOF;会将换行读到buf中,是相对安全的,不存在内存溢出
8.fputs(buf,p):写入文件一行
9.fscanf(p,”%d”,buf);从文件中读取一行字符串,格式化到buf中,忽略行尾的换行字符,超过buf大小的时候,有内存溢出的危险。
10.fprintf(p,”%d”,buf):将buf格式化到文件中的一行,指定输出到文件中。
11.fseek(p,offset,SEEK_SET)//从文件开头向后移动offset个字节。
   fseek(p,-1,SEEK_END)    //从文件末尾向前移动一个字节。
   fseek(p,1,SEEK_CUR)     //从当前位置向后移动一个字节。
程序:
1.文件拷贝: 就是使用getc()将一个文件读出一个字符后,使用putc()写入到另一个文件中。
2.文件加密:就是将一个文件读出一个字符后加一(C++),然后写入另一个文件当中。
3.文件解密:在加密文件的基础上,将一个文件读出一个字符后减一(C--),然后写入另一个文件
4.加载配置文件:将密钥写到a.ini这个文件中,然后使用fopen打开这个文件,得到里面的密钥,转换为int类型,并且返回到程序中。
5.将a.txt文件中,格式(i = 1)为这样的i后的值相加,然后写入b.txt
思路:得到文件的一行,然后得到“=”后面的字符串,将“=”后面的字符串转换为整数,然后sum += i,直到文件结束;将sum转换为字符串.
      还有另外一个思路就是使用sscanf(buf,”i = %d”,&i)将得到文件的一行中的数字格式化到i中。
代码:写一个函数getsubstr()得到“=”后面的子串,循环读取直到找到到“=”的时候返回return &s[i+1];
      将整数转换为字符串的时候,可以使用sprintf(buf,“%d”,sum)将sum格式化到buf中。
6.将a.txt文件中,格式(i = 1)为这样的i后的值排序,并且格式和a.txt的一样,然后写入b.txt
思路:用一个buf数组来保存从文件中读取的字符,每读取一行就放到一个raw字符数组中,然后将raw追加到buf后面,对buf进行冒泡排序,但是只对字符排序,遇到’\n’跳过。
代码:首先写一个字符串追加的函数,然后写冒泡排序,而且是改良版的,在遇到’\n’的时候,用下一个字符和上一个字符s[j+1]和s[j-1]比较,并且j++;直到下下个字符,因为已经比较了。

7.字符串追加:因为s2不需要改变,使用const
char* mystrcat(char *s1, const char* s2)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i;
    for (i = 0; i < len2; i++)
    {
        s1[len1 + i] = s2[i];
    }
    return s1;
}


文件操作
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#include<time.h>

struct num
{
    unsigned i;
};

int main()//写入a.dat文件随机数
{
    srand((unsigned int)time(NULL));
    struct num n;
    FILE *p = fopen("a.dat","wb");
    if (p == NULL)
    {
        return 0;
    }

    int i;
    for (i = 0; i < 10000000;i++)
    {
        n.i =rand() / 128;
        fwrite(&n,sizeof(n), 1, p);
        //printf("%d\n",rand()/128);

    }
    fclose(p);
    return 0;
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马