用C语言从文件中读取字符串
我有一个包含多个字符串的文件,每个字符串位于单独的行上。所有字符串的长度均为32个字符(因此33个字符串末尾带有“\n”) 我正在试着读所有的字符串。现在,我只想阅读它们,而不是按如下方式存储它们:用C语言从文件中读取字符串,c,string,file-io,C,String,File Io,我有一个包含多个字符串的文件,每个字符串位于单独的行上。所有字符串的长度均为32个字符(因此33个字符串末尾带有“\n”) 我正在试着读所有的字符串。现在,我只想阅读它们,而不是按如下方式存储它们: char line[32]; while (!feof(fp)) { fgets(line, 32, fp); } printf("%s", line); 这个打印出来的是零。为什么不起作用 此外,我试图在每次读取的字符串末尾存储一个空终止符。我将行数组更改为长度33,但是如果找到了'\n
char line[32];
while (!feof(fp)) {
fgets(line, 32, fp);
}
printf("%s", line);
这个打印出来的是零。为什么不起作用
此外,我试图在每次读取的字符串末尾存储一个空终止符。我将
行
数组更改为长度33
,但是如果找到了'\n'
,如何将其替换为\0
并将其存储?以下是一种基本方法:
// create an line array of length 33 (32 characters plus space for the terminating \0)
char line[33];
// read the lines from the file
while (!feof(fp)) {
// put the first 32 characters of the line into 'line'
fgets(line, 32, fp);
// put a '\0' at the end to terminate the string
line[32] = '\0';
// print the result
printf("%s\n", line);
}
事情是这样的:
char str[33]; //Remember the NULL terminator
while(!feof(fp)) {
fgets(str, 33, fp);
printf("%s\n",str);
}
代码不起作用,因为您只为包含30个字符的行以及换行符和空终止符分配空间,并且在
feof()
返回true后只打印一行
此外,feof()
仅在您尝试读取文件结尾后返回true。这意味着while(!feof(fp))
通常是不正确的-您只需读取直到读取函数失败-此时您可以使用feof()
/ferror()
来区分文件结束故障和其他类型的故障(如果需要)。因此,您的代码可以如下所示:
char line[34];
while (fgets(line, 34, fp) != NULL) {
printf("%s", line);
}
如果希望在行中找到第一个'\n'
字符,并将其替换为'\0'
,可以使用
中的strhr()
:
至于您的示例不起作用的原因,有两个原因,第一,字符串是非NUL终止的,第二,您在结束while循环后打印,因此它最多只能打印最后一行。另一种方法是使用相同的基本结构,使用fscanf(fp,“%s”,line)
,这样你就不需要提前知道字符串的大小,只要有一个足够大的数组。@iKiar:这样如果行中有空格字符,那将是一场灾难……这是真的,谢谢你指出。只能在没有空格的情况下工作,如单个单词、数字和字母的组合等。感谢,而(!feof()){}
通常不是正确的做法。EOF仅在尝试读取文件末尾时检测到-因此,例如,此代码将打印最后一行两次。由于fgets
自动添加空终止符,是否有方法“删除”该\n
而不是将其切换为空终止符并具有两个空终止符?如果不是,两个空终止符的“后果”是什么?@Nayefc:不太可能——唯一的“删除”方法是将不带它的字符串复制到一个新的、更小的数组中——但这样做没有什么意义。有两个空终止符没有任何后果-第一个空终止符之后的所有内容都被认为是垃圾,而不是字符串的一部分。我想,我几乎犯了同样的错误,…只是想澄清一下:这里的错误是条件while(!feof(fp))
而我插入了while(getchar!==EOF)
…我们的错误是相同的还是不同的?但是我的代码只打印了文件中的第一行,并且只在按enter键时才打印了下一行。@ArnavDas:是的,这与原始问题中的一个错误相同<代码>while(getchar()!=EOF)
是正确的选择。
char *p;
p = strchr(line, '\n');
if (p != NULL)
*p = '\0';