从文件中读取字符数组到二维数组

时间:2014-05-02 09:30:53

标签: c fopen

我尝试从10个方程式的文件中将方程式(如3 +5 / 6)读入2维数组时,在以下方法中遇到问题。

int count=1;
void read(){
  int i;
  int j;
  FILE *file = fopen("C:\\Users\\Sara\\Desktop\\Project2\\input", "r");

  if(file == NULL){
    printf("Unable to open file");
  }else{
    while(!feof(file)){
      for (i=0; i <=20; i++){
        for (j=0;j<=100;j++){
          if (fscanf(file,"%c", &array[i][j]) < 1) break;
          printf("Equation %d : %s \n", count, array[i]);
          count++;
        }
      }
    }
  }
  fclose(file);
}

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • 您没有显示如何定义数组,但我认为它是array[20][100]。有效的inices分别为0到19和0到100,上限在C中是唯一的。你的循环看起来像(i = 0; i <= 20; i++)并且包含那个边界,因此可以解决非法数组索引20和100。

  • 文本文件包含非零字符。换行符由ASCII代码为10的换行符表示,在C中可以写成'\n'

  • C中的字符串是char的数组,以null字符结尾。你永远不会终止你的字符串几乎所有标准字符串例程都要求字符串为零终止,因此在使用您的数组调用它们时不会产生所需的结果。 (您还需要记住为terimating null字符留出空间。)

  • 虽然可以使用fscanf(file, "%c", &c)来读取单个字符,但标准字符阅读功能c = getc(file)的开销较小,乍看之下更容易理解。

  • for循环通常在已知数组长度时使用。你不知道你有多少个方程,每个方程有多长。 while循环可能更好。

  • 我猜你count变量计算方程。因为你在内循环中增加它,所以你计算读取的字符总数。

  • 您反复阅读和覆盖这些行,因为您在外部循环中检查feof:读取20行;注意文件还没有到达终点;尝试将20多行读入相同的数据,依此类推。 (建议:不要使用feof;它通常不会执行您想要的操作。而是检查读取函数的返回值。例如,fscanf将返回EOF找到了文件的末尾。)

  • 轻微狡辩:打印错误消息时,应将其打印到stderr。此外,请务必使用换行符来终止它们以进行整洁打印。在邮件中包含文件名也是个好主意。

把所有这些放在一起:

int read(const char *fn)
{
    int i, j;
    FILE *file = fopen(fn, "r");

    if (file == NULL) {
        fprintf(stderr, "Unable to open file %s.\n", fn);
        return -1;
    }

    i = 0;
    j = 0;

    while (i < 20) {
        int c = getc(file);

        if (c == EOF) {
            /* End of file: stop reading */
            array[i][j] = '\0';
            break;
        }

        if (c == '\n') {
            /* New line: Begin new line and reset column counter */
            array[i][j] = '\0';
            j = 0;
            i++;
        } else {
            if (j < 100 - 1) array[i][j++] = c;
        }
    }

    fclose(file);        
    return i;
}

此函数将文件名作为参数,并返回读取的方程式数。无法打开文件时,返回特殊值-1。然而,它读入具有硬编码大小的全局数组。