读取文本文件并在c编程中存储在数组中

时间:2015-01-09 08:57:59

标签: c file-io

我想读取文本文件并存储在数组中然后显示。

这是我的代码:

  int i = 0, line = 5;
  char ch[100];

  FILE *myfile;
    myfile = fopen("test.txt","r");
    if (myfile== NULL)
    {
    printf("can not open file \n");
    return 1;
    }

    while(line--){
    fscanf(myfile,"%s",&ch[i]);
    i++;
    printf("\n%s", &ch[i]);
    }

    fclose(myfile);

    return 0;
}

这是我的文字:

测试123562

856

59986

但结果:

EST

2356

56

9986

有什么问题? :(

4 个答案:

答案 0 :(得分:5)

ch[i]持有一个字符。语句fscanf(myfile,"%s",&ch[i]);会将字符串扫描到只能容纳一个字符的ch[i]'\0'无法将您的计划引向未定义的行为。 更改

fscanf(myfile,"%s",&ch[i]);  

fscanf(myfile,"%s",ch);


以前的回答是错误的。程序的行为已明确定义,但您正在以错误的方式扫描文件。如果您在i++;声明之后放置printf,您的程序将按预期工作。

while(line--){
    fscanf(myfile,"%s",&ch[i]);
    printf("\n%s", &ch[i]);
    i++;
}   

原因是&ch[i]是指向数组的i th 元素的指针,字符串将存储在从位置i开始的数组中。对于给定的输入,这将起作用,因为给定的数组足够大以容纳字符串。

您可以这样做:

while(line--){
    fscanf(myfile,"%s",ch);
    printf("\n%s", ch);
    i++;
}   

但每次扫描字符串时它都会覆盖数组ch。最好使用二维数组来存储字符串并使用fgets读取文件。

答案 1 :(得分:2)

您将无法在单个char ch[100]数组中插入五行;这只是一个100个字符的数组。

你可以使它成为一个数组数组,即char ln[5][100],它将为你提供五行,每行100个字符的空间。

然后你当然需要在循环中索引该数组,即:

for(int i = 0; i < 5; ++i)
{
  if(fgets(ln[i], sizeof ln[i], myfile) == NULL)
  {
    fprintf(stderr, "Read error on line %d\n", i);
    exit(1);
  }
}

这使用fgets() 很多更适合阅读整行; fscanf()将停留在%s的空白区域,这很少是您想要的。

答案 2 :(得分:1)

获取字符串时无需在scanf中使用&符号。把它变成这样。

fscanf(myfile,"%s",&ch[i]);

fscanf(myfile,"%s",ch);

&ch[i]它将获得该数组中第i个位置的字符。如果您希望这样,可以使用%c代替%s。并将此更改为。

printf("\n%s", ch);

使用&符号时打印字符串,该&符号将访问该变量的地址。

答案 3 :(得分:-1)

  1. 开发的程序必须能够读取包含矩阵A和矩阵B的输入文件 使用fopen函数 一个。不同大小的矩阵A和B可以存储在不同的输入文件中(如果需要)。
  2. 使用fscanf函数和for循环
  3. 扫描并将矩阵A和B指定为数组
  4. 执行矩阵运算 一个。添加矩阵A和B. 湾减去矩阵A和B. C。矩阵A和B乘以
  5. 使用条件语句if或switch切换3,4和5元素矩阵。
  6. 使用fprintf打印在名为output.dat的新文件中获取的所有输入矩阵和结果 功能
  7. output.dat文件必须包含包含以下信息的标头: 一个。学生姓名 湾学生matric编号 C。课程部分 d。讲师姓名 即项目名称
  8. 在标题下方,输出文件必须包含矩阵A和B以及矩阵的结果 操作。 使用矩阵A和B,如下所示: