Чтение большого файла и размещение данных в правильном массиве, не будучи слишком устным - PullRequest
0 голосов
/ 29 марта 2019

Итак, я пытаюсь сделать так, чтобы у меня было два файла с массивом 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;
}

Я думаю, что все вы видите проблему .. Это никоим образом не является хорошим способом сделать это. Но я не знаю другого способа сделать это, не будучи таким словесным.

Есть ли способ сделать это более эффективным и чистым?

1 Ответ

2 голосов
/ 29 марта 2019

Вы можете использовать цикл и %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

Добавление простого счетчика, который вы увеличиваетев каждом цикле позволит вам хранить числа в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...