c - 从 C 中具有不同数据类型的文件中读取特定行

标签 c file scanf ansi-c

我的代码有一个严重的问题。我通过以下方式保存一些数据:

void savetofile()
{
  fprintf(savefile, "%d\n", run); // here are 1 or 2 characters
  fprintf(savefile, "%d\n", gender); // 1 character
  fprintf(savefile, "%s\n", name); // here is string, max 20 characters
  fprintf(savefile, "%d\n", points1); // between 1 and 3 characters
  fprintf(savefile, "%d\n", points2); // between 1 and 3 characters
}

保存后如何阅读?我可以以某种方式具体说明:

fscanf(savefile, "%d", &gender);

具体阅读第 2 行?

也许当我将数据保存到文件时:

void savetofile()
{
  fprintf(savefile, "%d ", run); // here are 1 or 2 characters
  fprintf(savefile, "%d ", gender); // 1 character
  fprintf(savefile, "%s ", name); // here is string, max 20 characters
  fprintf(savefile, "%d ", points1); // between 1 and 3 characters
  fprintf(savefile, "%d ", points2); // between 1 and 3 characters
}

这样会更容易阅读吗?

最佳答案

很多方法可以解决这个问题 - 每种方法都有优点和缺点。

在文件中使用带有“标签”的单行来指示数据 ID 怎么样?

void savetofile(int run, int gender, char *name, int points1, int points2) {
  fprintf(savefile, "r:%d g:%d n:\"%s\" p1:%d p2:%d\n", 
    run, gender, name, points1, points2);
}

// return 1: success, EOF:no more 0:problem data
int readfile(int &run, int &gender, char *name, int *points1, int *points2) {
  char buf[100];  // Size: 2x longest expected line
  if (fgets(buf, sizeof buf, savefile) == NULL) return EOF;
  if (sscanf(buf, "r:%2d g:%1d n:\"%19[^\"]\" p1:%3d p2:%3d", 
    &run, &gender, name, &points1, &points2) != 5) return 0;
  return 1;
}

各种其他改进都是可能的,特别是额外的错误检查,但以上是为了实现一些想法。

关于c - 从 C 中具有不同数据类型的文件中读取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47562647/

相关文章:

c - 为什么即使scanf中输入的值不等于1,printf函数也会打印输入的值

c - 在 C 中使用埃拉托斯特尼筛法的素数

java - 重命名后 tempfile 给出错误的绝对路径

将大量 JAR 添加到类路径时,Java 文件 IO 性能下降超过 30%

c - 在 C 中实现 ls -al 命令

c - 为什么我的第二个 printf 没有按预期调用?

c - 指针、列表和空值

c - 除非元素大小设置为+1,否则复制整数.csv的C程序将少复制一个元素

c - 如何使用 fwrite() 将结构写入文件?

c - c中的“计算电路的面积和周长”程序......奇怪的输出