1

我想读取我的 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

为什么????

4

4 回答 4

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

该代码将处理带有 16 个 s 的单行与int带有 4 个 s 的四行相同int。如果文件的格式是int每行 4 个 s 很重要,则使用读取单行fgets(),然后使用格式说明符sscanf()提取ints以确保处理完整的缓冲区:%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);
    }
}
于 2013-04-25T14:08:38.957 回答
1

要获得所需的输出 (1111,2222,...),请更改:

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

到:

fp1 = fopen("data.txt","r");

说明:使用fopen时应写下要读取的文件名。在你的情况下你必须写data.txt,而不是exact_enumerated_config_442_cub_mc......没有这个名称的文件,而且没有任何数据,如 1 1 1 1, 2 2 2 2, 3 3 3 3, 4 4 4 4...

有关更多详细信息,请访问:
wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen


这是您的“修改”(多余/浪费/额外{ }删除并data.txt写入)代码,可为您提供所需的输出:1 1 1 1, 2 2 2 2, 3 3 3 3, 4 4 4 4。它打印名为buffer. 代表着...

...数据已成功复制!从 "data.txt" buffer[4][4]:

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

int main()
{
    FILE *fp1;
    int i,j;

    int buffer[4][4];

    for ( i = 0; i < 4; i++ )
        for ( j = 0; j < 4; j++ )
            buffer[i][j] = 0;


    fp1 = fopen("data.txt","r");

    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            fscanf(fp1,"%d", &buffer[i][j]);

    fclose(fp1);


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

return 0;
}

附言

如果data.txt将不包含

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

1 1 1    1
2   2   2 2
3       3 3 3
4 444    // the last two elements are absent

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

4 444 0 0 

它打印4, then 444, 然后00: 最后两个元素是 '0's 因为buffer已经被零初始化,所以所有元素都改变了它们的值,但最后两个仍然是零。

于 2013-04-25T14:07:13.520 回答
1

在字符串格式的开头添加空格应该是" %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]);
}
于 2013-04-25T14:07:38.140 回答
0

你说你想读data.txt那你为什么要打开文件exact_enumerated_config_442_cub_mc

尝试改变这个

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

fp1 = fopen("data.txt","r");
于 2013-04-25T14:26:06.197 回答