补充
在开始文件的顺序读写之前,还有一些值得注意的地方。
模式化字符串"w"和"a",都是以写的模式打开文件,但是使用''w''打开文件会使现有文件的长度截为零,也就是会清楚现有文件内容,而以''a''模式打开文件则是在现有文件的末尾添加内容
例如:
char ch = '1';
FILE *fp = fopen("text.txt","w");
fputc(ch, fp);
fclose(fp);
经过运行以后我们可以看到text中的文件是
如果此时,我们在吧ch的值变成'2',我们将会看到的就是一个字符2,而不是12
更改之后的运行结果如下:
但是如果我们是以"a"模式打开的话,我们重复以上执行步骤,将会得到的是什么呢?
可以看到,我们得到的结果是在第一次运行结果后面追加了一个2,这就是"w"与"a"的区别了
顺序读写
在文件操作中,我们经常使用以下函数来帮我们输入和输出
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
fgetc 与 fputc
fgetc ()和fputc ()函数与 getchar ()和putchar ()函数类似,不同的地方是,我们需要告诉fgetc()和fputc()函数使用哪一个文件 。
事实上,getchar ()和putchar ()也是使用了文件,但是是标准文件 也就是显示屏与键盘。
在fgetc ()和fputc ()中,第一个参数是你要放入文件的字符,第二个参数是文件
例如:
char ch = '1';
FILE *fp = fopen("text.txt","w");
fputc(ch, fp);
fclose(fp);
fputc(ch, fp)的意义就是“把字符ch放入FILE指针fpout所指的文件中”
事实上 fputc()与putc () fgetc()与getc()有些许差别,前者是函数,而后者则是宏
这点我们以后再谈
fgetc()和fputc()只能写入和读取单个字符,如过想实现整行写入和读取的话则使用的是另一套函数
fgets()与fputs
他们的操作与fputc()和fgetc()相差不多,下面简单演示一下
FILE *fp = fopen("text.txt","w");
if (fp == NULL)
{
printf("Error");
}
fputs("qwertyuioo",fp);
fclose(fp);
当我们运行以后,text里的内容就变成了
同理fgets()也是一样
fgets()还有另一种用法
fgets(ch,number,fp);
其中 ch是char类型数组的名称,number是字符串的大小,fp是指向FILE的指针。
fgets()函数会读取输入一直到第一个换行符的前面,或者读到文件结尾,或者是读取number-1个字符。
在这里解释一些fgets()函数的用法:如以下函数
char a[9];
FILE *fp = fopen("text.txt","r");
if (fp == NULL)
{
printf("Error");
}
fgets(a,8,fp);
printf("%s",a);
在这里我提前再text中写入了17个a用来读取
fgets(a,8,fp);的意思就是在数组a中写入8-1也就是7个a
程序运行结果如下
如果fgets()在读到字符上限就读完了一整行,他就会把表示行结尾的换行符放在空字符前
当我们想使用格式化输入输出的时候,我们可以采用的是
fprintf()与fscanf()
fprintf()与fscanf()的操作与printf()和scanf()类似,但是区别是要在格式化字符串之前加入指向FILE的指针
下面简单的演示一下它们的用法
fprintf():
fscanf()