从文件中读取并将其存储在变量c中

时间:2013-04-08 15:57:48

标签: c

我正在尝试从文件中逐个字符地准备并将其存储在变量中。 我只需要文件的第一行,所以我使用'\ n'或EOF来停止读取字符,我也需要存储空格。听到的是我的程序,但我在编译时会收到警告,比如指针和整数之间的比较..当我运行时,我得到分段错误

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

5 个答案:

答案 0 :(得分:3)

你正在比较错误的事情。尝试:

ch != '\n'
      ^  ^

此外,正如其他答案所示,您使用len而未初始化。

最后,您确实认识到fgets也可以做到这一点。你可以把这个东西改写成:

if (fgets(txt, sizeof txt, fp))
    ...

答案 1 :(得分:2)

1)len未启动

int len=0;

2)来自fgetc()页面:

int fgetc ( FILE * stream );

因此fgetc()返回int而不是char,因此您必须将ch定义为int

int ch;

3)除了 cnicutar 备注外,还应使用while检查&&条件,而不是|| }:

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

4)完成从文件中读取后,必须在txt缓冲区的末尾添加空终止符charachter。

while循环

之后添加此行
txt[len]='\0';

BTW 您可以使用fscanf()阅读第一行,这样更容易。只需使用以下代码

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

"%[^\n]"表示fscanf将读取fp'\n'字符之外的所有字符,如果它获得此字符,它将停止阅读。因此,fscanf将读取fp中的所有字符,直到找到'\n'字符并将其保存到缓冲区txt中,并在末尾使用null终结符charchter。

"%29[^\n]"表示fscanf会读取fp中的所有字符,直到找到'\n'个字符,或者直到达到29个已读取的字符并将其保存到缓冲区{{} 1}}在末尾使用null终结符charchter。

答案 2 :(得分:1)

len未初始化,因此您可能尝试在txt结束之后编写方式。修复很简单 - 在声明

上将其初始化为0
int len = 0;

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

答案 3 :(得分: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);
}

答案 4 :(得分: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;
    }