3

我正在尝试从文件中逐字符读取并将字符存储在变量中。

只需要文件第一行的内容,所以我正在使用\nEOF停止阅读。它也需要存储SPACE

这是我的程序:

#include<stdio.h>
#include<string.h>

void main()
{
  FILE *fp;
  char ch;
  char txt[30];
  int len;
  fp=fopen("~/hello.txt","r");
  ch=fgetc(fp);
  while(ch != EOF || ch!="\n")
  {
    txt[len]=ch;
    len++;
    ch=fgetc(fp);
  }
   puts(txt);
}

但是我在编译指针和整数之间的比较时收到警告。当我运行它时,我遇到了分段错误。

4

5 回答 5

3

你在比较错误的东西。尝试:

ch != '\n'
      ^  ^

此外,正如在其他答案中发现的那样,您在使用len时没有初始化它。

最后,您确实意识到fgets也可以做到这一点。您可以将其重写为:

if (fgets(txt, sizeof txt, fp))
    ...
于 2013-04-08T15:59:48.517 回答
3

1)len未启动

int len=0;

2) 从fgetc()页面:

int fgetc ( FILE * stream );

所以fgetc()返回int而不是char所以你必须定义chint

int ch;

3) 除了cnicutar备注外,while条件应检查与&&而不是||

while(ch != EOF && ch!='\n')

txt4)完成从文件读取后,您必须在缓冲区末尾添加空终止符。

while在循环之后添加这一行

txt[len]='\0';

顺便说一句fscanf(),您可以更轻松地阅读第一行。只需使用以下代码

fscanf(fp, "%29[^\n]", txt);

将读取除字符之外的所有字符的"%[^\n]"方法,如果获取此字符,它将停止读取。因此, 它将读取所有字符,直到找到字符并将它们保存到最后带有空终止符字符的缓冲区中。fscanffp'\n'fscanffp'\n'txt

将读取所有字符的"%29[^\n]"方法,直到它找到字符或直到它达到 29 个读取的字符并将它们保存到最后带有空终止字符的缓冲区中。fscanffp'\n'txt

于 2013-04-08T16:01:31.110 回答
1

len未初始化,因此您可能正在尝试编写超出txt. 修复很简单 - 将其初始化为0声明

int len = 0;

除了 cnicutar 指出的错误,你还应该检查fopen使用之前的返回值fp

于 2013-04-08T16:01:04.100 回答
0
#include<stdio.h>
#include<string.h>

void main()
{
  FILE *fp;
  char ch;
  char txt[30];
  int len = 0;
  fp=fopen("~/hello.txt","r");
  if(!fp) {
    printf("Cannot open file!\n");
    return;
  }
  ch=fgetc(fp);
  while(ch != EOF && ch!= '\n' && len < 30)
  {
    txt[len] = ch;
    len++;
    ch=fgetc(fp);
  }
  txt[len] = 0;
  puts(txt);
}
于 2013-04-08T16:10:24.853 回答
0

该程序可以帮助您解决问题。

     #include<stdio.h>

     int main()
     {
       FILE *fp;
       int ch;
       char txt[300];
       int len=0;
       fp=fopen("tenlines.txt","r");

       do{
           ch=fgetc(fp);
           txt[len]=ch;
           len++;
         } while(ch!=EOF && ch!='\n');
     fclose(fp);
     puts(txt);

     return 0;
    }
于 2017-01-30T16:37:02.070 回答