【问题标题】:How to Read and Write integers to a file如何在文件中读取和写入整数
【发布时间】:2014-04-12 01:32:51
【问题描述】:

问题是我试图读取一些整数以了解我已经通过的游戏关卡,然后如果 t 还没有,我想将当前关卡的整数设置为 1。它创建文件但不写任何东西。有谁知道为什么?现在,它在第一次使用 printf 创建它时执行此操作,但在读取它时会出现状态访问冲突。

void SaveGame(void)
{
  FILE *pFile = fopen("SavedData.txt","rb");
  int MyArray[8] = {0};

  if(pFile)
  {
    fscanf(pFile, "%d %d %d %d %d %d %d %d" , MyArray[0], MyArray[1], MyArray[2], MyArray[3], MyArray[4], MyArray[5], MyArray[6], MyArray[7]);
    fclose(pFile);
  }

  if(MyArray[Current] == 0)
    MyArray[Current] = 1;

  pFile = fopen("SavedData.txt", "wb");

  if(pFile)
  {
    fprintf(pFile, "%d %d %d %d %d %d %d %d" , MyArray[0], MyArray[1], MyArray[2], MyArray[3], MyArray[4], MyArray[5], MyArray[6], MyArray[7]);
    fclose(pFile);
  }
}

【问题讨论】:

  • if(MyArray[Current] = 0) 你需要使用==
  • 您需要将文件句柄传递给feof ... feof(pFile);
  • 你的写循环是无限的。即,由决定文件的结束位置。
  • while (!feof(pFile)) 在读取循环中可能比while (!feof)
  • 现在,它是第一次使用 printf 创建它但读取它时会出现状态访问冲突??

标签: c file file-io


【解决方案1】:

你可以做你想做的事情(未经测试):

#define SAVE_FILE "SavedData.txt"
#define NUMS_SIZE 8

void SaveGame() {
  FILE *f;

  f = fopen(SAVE_FILE, "r");
  if (!f) {
    fprintf(stderr, "Error: Can't open save file for reading.\n");
    exit(-1);
  }

  int nums[NUMS_SIZE] = {0};
  int n, i = 0;
  while (fscanf(f, "%d", &n) == 1) {
    if (i >= NUMS_SIZE) break;
    nums[i++] = n;
  }
  fclose(f);

  f = fopen(SAVE_FILE, "w");
  if (!f) {
    fprintf(stderr, "Error: Can't open save file for writing.\n");
    exit(-1);
  }
  int j = 0;
  if (i > 0) fprintf("%d", nums[0]);
  for (j = 1; j < i; ++j)
    fprintf(" %d", nums[j]);
  fclose(f);
}

【讨论】:

  • 输出循环应该在i的前一个值结束,而不是NUMS_SIZE。输入循环应该在溢出nums 的边界之前停止。
  • @MattMcNabb 同意。更新。尽管它实际上取决于 OP 如何想要它。我想象文件中有 8 个零,但最好检查一下。
  • 没错,即使输入无效,他也可能想写 8 个数字。
【解决方案2】:

这不是你读取文件的方式。

对于初学者,如果它是一个文本文件,请以"r" 模式打开,而不是"rb"

当您执行读取操作时,您应该检查读取操作是成功还是失败。你不这样做feof。有很多代码可以做到feof,而且大部分都是错误的。复制互联网代码示例时要小心。

此外,阅读您使用的任何标准函数的文档也是一个好主意。你可能会学到一些你不知道的功能。例如,fscanf 返回成功读取的项目数。

所以在你的阅读循环中,要么检查 fscanf 返回 8(或者按照 ooga 的建议循环 8 次,每次检查 1)。不要在循环期间检查feof

一旦读取失败,您可以选择feof 找出读取失败的原因,如果您想知道的话。它可能会失败,因为您到达文件末尾 (feof),或者因为设备错误 (ferror),或者因为文件中包含单词而不是数字。

当你写的时候,确保你只写成功读取的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多