趣学 C 语言(七)—— 文件读写操作

来源:互联网 发布:window10下安装ubuntu 编辑:程序博客网 时间:2024/05/02 06:10
  • (1)rewind:函数把文件内部位置指针移到文件首;
  • (2)fseek:移动文件流的读写位置;

1. 字符读写函数 :fgetc和fputc

在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。

在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后, 该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。 应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。

FILE *fp assert(fp = fopen("", "rb"));char ch;ch = fgetc(fp);while (ch != EOF){    putchar(ch);                                // 屏幕上显示    ch = fgetc(fp);}                                // #define EOF (-1)
assert(fp = fopen("", "wt+"));printf("input a string: \n");char ch;ch = getchar();while (ch != '\n'){    fputc(ch, fp);    ch = getchar();}

一个小案例
把命令行参数中的前一个文件名标识的文件, 复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。

typedef FILE* FP;FP fp1, fp2;assert(fp1 = fopen(argv[1], "rb"));if (argc == 2) fp2 = stdout;else fp2 = fopen(argv[2], "wt+");char ch;while ((ch = fgetc(fp1)) != EOF)    fputc(ch, fp2);fclose(fp1);fclose(fp2);

2. 字符串读写函数:fgets和fputs

读字符串函数 fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:

fgets(字符数组名, n, 文件指针);

其中的 n 是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。

FILE *fp;char str[11];assert(fp = fopen("....", "rb"));fgets(str, 11, fp);                        // 只传递 10 个元素,第11个为 '\0',标识结束

3. 数据块读写函数:fread和fwrite

fread(buffer,size,count,fp);                        // size 表示字节数                        // count 数据块块数fwrite(buffer,size,count,fp);

fread(fa,4,5,fp);其意义是从fp所指的文件中,每次读 4 个字节(一个实数)送入实数组fa中,连续读 5 次,即读 5 个实数到 fa 中。

实现如下功能:从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。

struct Stu{    int id;    char name[10];    int age;    char addr[12];} boys[2], copy[2], *pp, *qq;pp = boys; qq = copy;FILE *fp;assert(fp = fopen("...", "wt+"));int i;for (i = 0; i < 2; ++i, ++pp)    scanf("%d %s %d %s", &pp->id, pp->name, &pp->age, pp->addr);pp = boys;fwrite(pp, sizeof(struct Stu), 2, fp);rewind(fp);fread(qq, sizeof(struct Stu), 2, fp);for (i = 0; i < 2; ++i, ++qq)    printf("id: %d, name: %s, age: %d, addr: %s\n", qq->id, qq->name, qq->age, qq->addr);fclose(fp);

4. 格式化读写函数:fscanf和fprinf

fscanf 函数,fprintf 函数与前面使用的 scanf 和 printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:

fscanf(fp, "%d %s", &i, s);fprintf(fp, "%d %c", j, ch); 
struct Stu{    int id;    char name[10];    int age;    char addr[20];} boys[2], copy[2], *pp, *qq;pp = boys; qq = copy;FILE *fp;assert(fp = fopen("...", "wt+"));// 从控制台格式化输入到结构体int i;for (i = 0; i < 2; ++i, ++pp)    scanf("%d %s %d %s", &pp->id, pp->name, &pp->age, pp->addr);pp = boys;// 格式化输出到文件for (i = 0; i < 2; ++i, ++pp)    fprintf(fp, "%d %s %d %s\n", pp->id, pp->name, pp->age, pp->addr);rewind(fp);// 从文件格式化输出到结构体for (i = 0; i < 2; ++i, ++qq)    fscanf(fp, "%d %s %d %s", &qq->id, qq->name, &qq->age, qq->addr);qq = copy;// 从结构体输出到控制台for (i = 0; i < 2; ++i, ++qq)    printf("%d %s %d %s\n", qq->id, qq->name, qq->age, qq->addr);fclose(fp);
0 0