c - 如何使用 fscanf 读取多行

标签 c scanf

我想读取我的 data.txt 文件,它看起来像并将它存储在一个名为 buffer[i][j] 的数组中

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4

我写的代码看起来像

#include"stdio.h"
#include"stdlib.h"

int main() {

  FILE *fp1;
  int i,j;

  int buffer[4][4]={0};

  fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      fscanf(fp1,"%d", &buffer[i][j]);
    }
    // fscanf(fp1,"\n");
  }
  fclose(fp1);

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      printf("%d ",buffer[i][j]);
    }
    printf("\n");
  }
}

但我得到了输出...

1 1 2 1

5 1 6 1

17 1 18 1

21 1 22 1

为什么????

最佳答案

  • 始终检查 fopen() 的结果以确保文件已打开。
  • 始终检查 fscanf() 的结果以确保它成功并防止后续代码处理可能未分配值的变量(它返回分配的数量)。
  • 在格式说明符中添加一个前导空格字符以跳过空格,包括换行符:"%d"

该代码将处理具有 16 个 int 的单行与具有四个 int 的四行相同。如果文件的格式是每行四个 int 很重要,那么使用 fgets() 读取一行然后使用 sscanf() 提取带有 %n 格式说明符的 int 以确保处理完整缓冲区:

int ints[4][4] = { { 0 } };
char buffer[1024];
for (int i = 0; i < 4 && fgets(buffer, 1024, fp); i++)
{
    int pos;
    if (sscanf(buffer,
               "%d %d %d %d%n",
               &ints[i][0],
               &ints[i][1],
               &ints[i][2],
               &ints[i][3],
               &pos) != 4 || pos != strlen(buffer) - 1)
    {
        fprintf(stderr, "Invalid format: <%s>\n", buffer);
        exit(1);
    }
}

关于c - 如何使用 fscanf 读取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216799/

相关文章:

c - 为什么 scanf 的第一次输入总是给我零?

c - scanf() 仅读取第一个输入(数字)

c - 添加对指针的操作

c - C 中 char 函数应该返回什么?

C 读和线程安全 (linux)

将二进制序列化转换为人类可读的序列化

c - 在c中读取一个字符和一个数字

C - 链表无法将节点**转换为节点*

C:将指针传递给递归函数

scanf - 从 Ada 调用 scanf