在C语言中从文件中读取字符串

3
我有一个包含多个字符串的文件,每个字符串单独占一行。所有的字符串都是32个字符长(所以包括结尾的'\n'总共33个字符)。
我试图读取所有的字符串。目前为止,我只想读取它们而不将它们存储,方法如下:
char line[32];
while (!feof(fp)) {
    fgets(line, 32, fp);
}
printf("%s", line);

这会打印出零。为什么它不工作呢?

此外,我试图在每个读取的字符串末尾存储一个空终止符。我将line数组更改为长度为33,但如果找到'\n',我该如何替换它并存储\0呢?


关于为什么你的示例不起作用,有两个原因:首先,字符串没有以NUL结尾;其次,在while循环结束后才打印,所以最多只会打印最后一行。 - John Scipione
3个回答

4
你的代码无法运行,因为你只为每行分配了30个字符和一个换行符以及一个null终止符的空间,并且你只在feof()返回true之后打印出一行。
此外,feof()仅在尝试并且无法读取文件末尾时才返回true。这意味着while (!feof(fp))通常是不正确的,你应该简单地读取直到读取函数失败,在那个点上你可以使用feof()/ferror()来区分文件结束和其他类型的故障(如果需要)。所以,你的代码可能看起来像这样:
char line[34];

while (fgets(line, 34, fp) != NULL) {
    printf("%s", line);
}

如果您希望在line中找到第一个'\n'字符,并将其替换为'\0',则可以使用来自<string.h>strchr()函数:

char *p;

p = strchr(line, '\n');
if (p != NULL)
    *p = '\0';

由于 fgets 自动添加了空终止符,是否有一种方法可以“删除” \n 而不是将其转换为空终止符并具有两个空终止符?如果没有,那么两个空终止符的“后果”是什么? - darksky
@Nayefc:不完全是这样——唯一的“删除”方法是将没有它的字符串复制到一个新的、更小的数组中,但这样做几乎没有任何意义。有两个空终止符并没有什么后果——第一个空终止符之后的所有内容都被视为不属于字符串的垃圾。 - caf
我认为,我几乎犯了同样的错误,只是想澄清一下:这里的错误是条件while(!feof(fp)),而我插入了while(getchar()!==EOF)......我们的错误是相同的还是不同的?但我的代码只打印了文件中的第一行,然后按回车键才会打印下一行。 - Arnav Das
@ArnavDas:是的,这与原问题中的一个错误相同。while (getchar() != EOF)是正确的方法。 - caf

1

这里是一个基本的方法:

// 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);
}

另一种使用相同基本结构的方法是使用 fscanf(fp,"%s",line);,这样您就不需要提前知道字符串的大小,只需有足够大的数组即可。 - gkiar
@iKiar:如果该行中有空格字符,那将是一场灾难... - derekhh
没错,谢谢指出。只有没有空格的单词、数字和字母组合等才有效。谢谢。 - gkiar
while (!feof()) { }通常不是正确的做法。只有在尝试读取文件末尾后才会检测到EOF,因此例如此代码将会打印最后一行两次。 - caf

0

它大致是这样的:

char str[33]; //Remember the NULL terminator
while(!feof(fp)) {
  fgets(str, 33, fp);
  printf("%s\n",str);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接