c - 读取一个大文件并将数据放在正确的数组中而不要太口头表达

标签 c

所以我想要做的是我有两个文件,它们的 64x64 数组由空格和换行符分隔。我想要做的是读取文件并将其放置在包含两个 64x64 数组的结构中。这些文件看起来像这样:

2 5 1 6 2 ... 6 
3 2 9 5 1 ... 8 
. 
. 
2 4 1 5 2 ... 5

这就是我想做的事情

int
getFromFile(char *fileNameMatrixA, char *filenameMatrixB, struct Matrises *matrix)
{
  FILE *fileA, *fileB;
  char buffer[BUFFER_LEN];
  int counter = 0;

  if((fileA = fopen(fileNameMatrixA, "r")) == NULL)
    {
      return 1;
    }

  if((fileB = fopen(fileNameMatrixB, "r")) == NULL)
    {
      fclose(fileA);
      return 2;
    }

  while(fgets(buffer, sizeof(buffer), fileA) != NULL)
    {
      if(sscanf(buffer, "%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d", matrix->matrixA[counter][0], matrix->matrixA[counter][1], matrix->matrixA[counter][2], matrix->matrixA[counter][3], ... , matrix->matrixA[counter][63]) != 64)
    {
      fclose(fileA);
      fclose(fileB);
      return 3;
    }
      counter++;
    }

  counter = 0;

  while(fgets(buffer, sizeof(buffer), fileB) != NULL)
    {
      if(sscanf(buffer, "%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d\s%d", matrix->matrixB[counter][0], matrix->matrixB[counter][1], matrix->matrixB[counter][2], matrix->matrixB[counter][3], ... , matrix->matrixB[counter][63]) != 64)
    {
      fclose(fileA);
      fclose(fileB);
      return 4;
    }
      counter++;
    }

  fclose(fileA);
  fclose(fileB);
  return 0;
}

我想你们所有人都看到了问题.. 这绝不是一个好的方法。但是我不知道还有什么其他的方法可以不那么口头表达。

有没有一种方法可以更高效、更干净地执行此操作?

最佳答案

您可以使用循环和%n 在每个循环中扫描一个数字。 %n 的目的是获取扫描使用的字符数。通过这种方式,您可以按数字迭代字符串编号。

这是一个例子:

int main(int argc, char *argv[])
{
    char buf[20] = "1 2 3 4";  // Assume this is the data read using fgets
    int x;
    int offset = 0;
    int temp;
    while (sscanf(buf + offset, "%d%n", &x, &temp) == 1)
    {
        printf("At offset %d scanned %d\n", offset, x);
        offset += temp;
    }
}

输出:

At offset 0 scanned 1
At offset 1 scanned 2
At offset 3 scanned 3
At offset 5 scanned 4

添加一个在每个循环中递增的简单计数器将允许您将数字存储在数组中。

关于c - 读取一个大文件并将数据放在正确的数组中而不要太口头表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55420186/

相关文章:

c - 如何检查存储在地址中的各个字节的情况?

C - 奇怪的二维数组指针行为

创建ip网络数据包

c++ - 如何在 c 中转换 std::numeric_limits<float>::epsilon()?

c - 尝试打印表单数组或数组地址...不明白?

c - 如何查找数组中整数之间是否存在共同差异?

c - 同时标记匹配和转义匹配外的特殊字符

c - 动态增长的字符串和子程序数组

C位运算谜题

c - 动态内存分配的流行用法