【问题标题】:is there any other way to read data from file?还有其他方法可以从文件中读取数据吗?
【发布时间】:2021-09-15 22:06:30
【问题描述】:

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

int main() {
  FILE *fp;
  int a[25], i = 0, o[25], e[25];
  fp = fopen("number.txt", "r");

  for (i = 0; i < 20; i++) {
    fscanf(fp, "%d", &a[i]);
    if (a[i] < 2 && a[i] > -2) {
      if (a[i] == 0)
        e[i] = a[i];
      else
        o[i] = a[i];
    } else if (a[i] % 2 == 0)
      e[i] = a[i];
    else
      o[i] = a[i];
  }
  fclose(fp);
  fp = fopen("even.txt", "w+");
  for (i = 0; i < 10; i++) {
    fprintf(fp, "%d ", e[i]);
  }
  fclose(fp);
  fp = fopen("odd.txt", "w+");
  for (i = 0; i < 10; i++) {
    fprintf(fp, "%d ", o[i]);
  }
  fclose(fp);
  return 0;
}

这里我试图从名为 number 的文件中读取数字,然后将它们区分为奇数和偶数。之后,我将奇数复制到一个名为奇数的文件,将偶数复制到一个名为偶数的文件,但不是复制正确的数字,而是复制随机值

【问题讨论】:

  • 进行基本调试。在调试器中运行您的程序并在运行时对其进行检查。 How to debug small programs。一个问题:if(a[i]==0) e[i]=a[i]; else o[i]=a[i]; 导致数组中出现“漏洞”。这正是结果文件显示的内容。在每次迭代中,i 都会递增,但只有一个数组的值会设置在该 i 索引处。

标签: c file


【解决方案1】:

这是第一步:

for (i = 0; i < 25; ++i) e[i] = o[i] = 9999;

然后你会发现有9999 值散布在两个最终数组中。

至于为什么,请考虑序列7, 8。七个进入a[0],然后,奇怪的是,也进入o[0]

八个进入a[1],然后,甚至,也进入e[1],留下e[0]在这一步之前保持它具有的任意值。那是因为您对所有三个数组访问都使用了i

index:   0  1  2  3 ...
-----------------------
e:       ?  8  ?  ? ...
o:       7  ?  ?  ? ...

你最好做的是保持三个单独的计数。事实上,two 就可以了,因为在输入数字被发送到正确的数组后,您再也不需要再次使用它了。这意味着a[] 是不必要的。

例如(并特别注意较长的变量名称,当您稍后查看代码时,这将变得非常宝贵,或者其他人必须这样做):

int value, oddIdx = 0, evenIdx = 0;
for (int i = 0; i < 20; ++i) {
    if (fscanf(fp, "%d", &value) != 1) // should handle invalid data.
        ;
    if (value % 2 == 0) {
        evens[evenIdx++] = value;
    } else {
        odds[oddIdx++] = value;
    }

还要注意该代码中简化的奇偶校验。我不确定为什么您认为您必须将 -1, 0, 1 视为原始代码中的特殊情况,但它们工作得很好。

然后打印它们(此处为标准输出,但在您的情况下为文件):

for (int i = 0; i < oddIdx; ++i)
    printf("Odd : %d\n", odds[i]);

for (int i = 0; i < evenIdx; ++i)
    printf("Even: %d\n", evens[i]);

最后一点,您甚至不需要 任何 数组,因为一旦您将数字写入正确的文件(并且您可以在阅读后立即执行此操作)它),你可以把它扔掉。

这样做,处理错误并允许任何输入大小,最终会得到这样的程序:

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

int main(void) {
    // Open all files, cleaning up on failure
    //   (fail fast strategy).

    FILE *fileIn, *fileEven, *fileOdd;

    if ((fileIn   = fopen("number.txt", "r")) == NULL) {
        fprintf(stderr, "Cannot open input file.");
        return -1;
    }

    if ((fileEven   = fopen("even.txt", "w")) == NULL) {
        fprintf(stderr, "Cannot create even file.");
        fclose(fileIn);
        return -1;
    }

    if ((fileOdd   = fopen("odd.txt", "w")) == NULL) {
        fprintf(stderr, "Cannot create odd file.");
        fclose(fileIn);
        fclose(fileEven);
        return -1;
    }

    // All open now, start processing input of any
    //   size, stop when no numbers left (end of
    //   file, or invalid number).

    while (fscanf(fileIn, "%d", &value) == 1) {
        // Allocate to odd or even file.

        if (value % 2 == 0) {
            fprintf(fileEven, "%d ", value);
        } else {
            fprintf(fileOdd, "%d ", value);
        }

        // Or could be "clever" with:
        //   fprintf((value % 2 == 0) ? fileEven : fileOdd, "%d ", value);

    }

    // Put newline at end of output files, just to be
    //   nice, then close all files and exit.

    fputc('\n', fileEven);
    fputc('\n', fileOdd);

    fclose(fileIn);
    fclose(fileEven);
    fclose(fileOdd);

    return 0;
}

并且请(如果这是课堂作业)使用此代码来教育自己,而不是尝试将其作为自己的代码传递出去。假设您的教育工作者不检查抄袭,您将是愚蠢的。

【讨论】:

    【解决方案2】:

    这些数组中的值。

    index 0 1 2 3 4 ...
    a     1 2 3 4 5 ...
    e     # 2 # 4 # ...
    o     1 # 3 # 5 ...
    

    # 是随机数。

    您需要重新考虑循环逻辑。

    顺便说一句,这会更容易阅读

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main() {
        FILE *fp;
        int a[25], i = 0, o[25], e[25];
        fp = fopen("number.txt", "r");
    
        for (i = 0; i < 20; i++) {
            fscanf(fp, "%d", &a[i]);
            if (a[i] < 2 && a[i] > -2) {
                if (a[i] == 0)
                    e[i] = a[i];
                else
                    o[i] = a[i];
            } else if (a[i] % 2 == 0)
                e[i] = a[i];
            else
                o[i] = a[i];
        }
        fclose(fp);
        fp = fopen("even.txt", "w+");
        for (i = 0; i < 10; i++) {
            fprintf(fp, "%d ", e[i]);
        }
        fclose(fp);
        fp = fopen("odd.txt", "w+");
        for (i = 0; i < 10; i++) {
            fprintf(fp, "%d ", o[i]);
        }
        fclose(fp);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2014-06-24
      • 2017-04-17
      相关资源
      最近更新 更多