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

  • (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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值