如何使用fscanf读取多行

如何使用fscanf读取多行,c,scanf,C,Scanf,我想读取类似的data.txt文件,并将其存储在名为buffer[I][j]的数组中 1 二,二, 三三三 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++

我想读取类似的data.txt文件,并将其存储在名为buffer[I][j]的数组中

1

二,二,

三三三

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

5161

171181

211221


为什么要获得所需的输出11112222,。。。更改:

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

说明:使用fopen时,您应该写下要读取的文件名。在您的情况下,您必须写入data.txt,而不是确切的枚举配置文件。。。 没有使用此名称的文件,而且也没有类似于1 1,2 2 2,3 3 3,4 4 4的任何数据

有关更多详细信息,请访问:

这是您修改过的多余/浪费/额外{}已删除,data.txt是为您提供所需输出的书面代码:1 1、2、2、2、3、3、4。 它打印名为buffer的数组。这意味着

…数据已成功复制!从data.txt到缓冲区[4][4]:

但是

程序将正确读取第1行、第2行和第3行,第4行的输出将为

4 444 0 0 

它打印4,然后是444,然后是0和0:最后两个元素是“0”,因为缓冲区已由零初始化,所以所有元素都更改了它们的值,但最后两个仍然是零。

要获得所需的输出11112222,。。。更改:

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

说明:使用fopen时,您应该写下要读取的文件名。在您的情况下,您必须写入data.txt,而不是确切的枚举配置文件。。。 没有使用此名称的文件,而且也没有类似于1 1,2 2 2,3 3 3,4 4 4的任何数据

有关更多详细信息,请访问:

这是您修改过的多余/浪费/额外{}已删除,data.txt是为您提供所需输出的书面代码:1 1、2、2、2、3、3、4。 它打印名为buffer的数组。这意味着

…数据已成功复制!从data.txt到缓冲区[4][4]:

但是

程序将正确读取第1行、第2行和第3行,第4行的输出将为

4 444 0 0 

它打印4,然后是444,然后是0和0:最后两个元素是“0”,因为缓冲区已由零初始化,所以所有元素都更改了它们的值,但最后两个仍然是零。

在字符串格式的开头添加空格,它应该是%d,以避免换行问题

fscanf(fp1," %d", &buffer[i][j]);
顺便说一句,您可以使用以下代码

for(i=0;i<4;i++) {
   fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}

在字符串格式的开头添加空格它应该是%d以避免换行问题

fscanf(fp1," %d", &buffer[i][j]);
顺便说一句,您可以使用以下代码

for(i=0;i<4;i++) {
   fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}
始终检查的结果,以确保文件已打开。 始终检查的结果,以确保它是成功的,并防止后续代码处理变量可能未被分配它返回的分配数量的值。 将前导空格字符添加到格式说明符以跳过空白,包括换行符:%d。 该代码将把16整数的单行视为4整数的四行。如果文件的格式为每行四个整数很重要,则使用sscanf读取单行,然后使用%n格式说明符提取整数,以确保处理了完整的缓冲区:

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);
    }
}
始终检查的结果,以确保文件已打开。 始终检查的结果,以确保它是成功的,并防止后续代码处理变量可能未被分配它返回的分配数量的值。 将前导空格字符添加到格式说明符以跳过空白,包括换行符:%d。 该代码将把16整数的单行视为4整数的四行。如果文件的格式为每行四个整数很重要,则使用sscanf读取单行,然后使用%n格式说明符提取整数,以确保处理了完整的缓冲区:

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);
    }
}

您说过要读取data.txt,那么为什么要打开文件exact\u enumerated\u config\u 442\u cub\u mc

试着改变这个

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


您说过要读取data.txt,那么为什么要打开文件exact\u enumerated\u config\u 442\u cub\u mc

试着改变这个

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


如果将读取文件部分替换为%d%d%d%d,并将&buffer[i][0]、&buffer[i][1]等替换为&buffer[i][1],会发生什么情况。请告诉我exact_enumerated_config_442_cub_mc的意思是什么?应该是data.txt。我忘了更改文件名。。。我出错。如果将读取文件部分替换为%d%d%d%d,将&buffer[i][0]、&buffer[i][1]等替换为&buffer[i][1],会发生什么情况。请告诉我确切的枚举配置\u 442\u cub\u mc是什么意思?应该是data.txt。我忘了更改文件名。。。就我而言,错误。+1只回答到目前为止解决了代码的所有问题。一如既往,我同意最好使用fgets读取行,然后使用sscanf将单词解析为变量。+1只回答到目前为止该地址的问题
我同意最好使用fgets读取行,然后使用sscanf将字解析为变量。我不怀疑这就是问题所在。我写的是data.txt,而不是exact_enumerated_config_442_cub_mc,我得到了所需的输出:1 1 1,2 2 2 2,3 3 3,4 4 4。也许,我不太理解这个问题。我不是说我的答案提供了最好的解决方案,但它是有效的!:我不怀疑这就是问题所在。我写了data.txt而不是确切的枚举配置,我得到了所需的输出:1 1 1,2 2 2,3 3 3,4 4 4 4 4。也许,我不太理解这个问题。我不是说我的答案提供了最好的解决方案,但它是有效的!: