以前的博客提到了怎样对长度不肯定且没法估计的文本文件进行按行读取的问题,此次我发现了一个每一行的末尾换行符处理的问题以及fgets的一个特性,这都是我以前没有注意到的地方。web
首先,问题的导入在于我写的一个小程序。
1.我在一个文本文件中打字,而后想用fgets读取第一行的内容2.我想再读取以后对数组进行打印来体现出换行符的存在3.发现问题。
下面是文本文件的内容:
下面是控制台打印读取的内容。(我把数组初始化为’9’,为了视觉方便,每一个字符两侧放上:)
能够看到读取结果显示每行末尾存在着两个换行符。而且,那个空格字符是哪来的??小程序
1.为何有两个换行符?
Windows系统下换行符是两个字符’\r’和’\n’,因此会换行两次
2.空格哪来的??
fgets会再读取结束后在输入流的末尾自动加上’\0’做为结束的标志,而打印’\0’字符就是一个空格。数组
下面是我写的代码,能够看一看,svg
#include <stdio.h> #include <stdlib.h> #define filepath "e:info.txt" #define MAXLEN 100 int main(void) { FILE *fp = fopen(filepath, "r"); if (!fp) {printf("file open error!\n"); system("pause"); exit(0);} char target[16]; for (int i = 0; i < 16; ++i) target[i] = '9'; fgets(target, 16, fp); for (int i = 0; i < 16; ++i) printf(":%c:\n", target[i]); system("pause"); fclose(fp); return 0; }
那么fgets真的会在流自动末尾加上’\0’吗?函数
咱们经过实际操做来验证,下面是代码:spa
#include <stdio.h> #include <stdlib.h> #define filepath "e:info.txt" #define MAXLEN 100 int main(void) { char a[10]; for (int i = 0; i < 10; ++i) a[i] = '1'; fgets(a, 5, stdin); for (int i = 0; i < 10; ++i) printf(":%c:\n", a[i]); system("pause"); return 0; }
那么结果如何?rest
能够看到在我输入"afsv"以后fgets确实在末尾自动加上了’\0’,而且打印时体现为空格code