您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
fscanf与fgets读取文件时与换行之间的冲突
发布时间:2021-04-16 21:15:42编辑:雪饮阅读()
有一文件tmp/test.txt内容如:
asdasdas
This is testing for fprintf...
This is testing for fputs...
那么这里尝试用fscanf函数和fgets函数进行读取,这个读取程序如:
#include <stdio.h>
int main()
{
FILE *fp = NULL;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
在这里你会发现这第二个读取语句为什么是空白的呢?
使用 int fscanf(FILE *fp, const char *format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。
而这里第一个读取函数正好就是fscanf函数,而第一行内容结束时候又正好是换行符,所以第一行会被正常读取,只剩下一个换行符。
此时第二个函数开始fgets这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。
这里的重点就是fgets虽然也会在换行符的时候停止,但是它返回的时候时会包括换行符的。
而第一个fscanf读取结束也就只剩下一个换行符,所以这里第二个语句fgets读取的内容也就只有一个换行符,于是第二行输出自然只是一个换行符,在控制台肯定是空的。
那么接下来的fgets语句读取的则就是原来本该正常读取的第二行内容,这样以来整个程序就都执行完了,但是至此test.txt中还有第三行没有读取。
那么这里的解决办法有两个,一个就是在test.txt中将第一行去除,另外一个自然是在程序中多加一行和前面一样的fgets读取语句。
关键字词:fscanf,fgets,换行