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

用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

我有一个包含多个字符串的文件,每个字符串位于单独的行上。所有字符串的长度均为32个字符(因此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';