C - Чтение мультилинии из текстового файла - PullRequest
0 голосов
/ 11 августа 2011

Скорее всего, это глупый вопрос!У меня есть текстовый файл, заполненный случайными числами, и я хотел бы прочитать эти числа в массив.

Мой текстовый файл выглядит так:

1231231 123213 123123
1231231 123213 123123
0

1231231 123213 123123
1231231 123213 123123
0

И так далее. Частьof numberse заканчивается на 0

Это то, что я пробовал до сих пор:

FILE *file = fopen("c:\\Text.txt", "rt");
char line[512];

if(file != NULL)
{
    while(fgets(line, sizeof line, file) != NULL)
    {
        fputs(line, stdout);
    }
    fclose(file);
}

Это явно не работает, так как я читаю каждую строку в одну и ту же переменную.

Как я могу прочитать строки, и когда строка получает строку, где она заканчивается на 0, а затем сохранить этот фрагмент текста в массив?

Вся помощь приветствуется.

1 Ответ

1 голос
/ 11 августа 2011

Вам просто нужно хранить числа, которые вы прочитали из файла, в каком-то постоянном хранилище! Кроме того, вы, вероятно, хотите проанализировать отдельные числа и получить их числовое представление. Итак, три шага:

  1. Выделите немного памяти для хранения чисел. Массив массивов выглядит как полезная концепция, один массив для каждого блока чисел.

  2. Разбить каждую строку на строки, соответствующие одному числу, используя strtok.

  3. Разобрать каждое число в целое число, используя atoi или strtol.

Вот пример кода, с которого можно начать:

FILE *file = fopen("c:\\Text.txt", "rt");
char line[512];

int ** storage;
unsigned int storage_size = 10; // let's start with something simple
unsigned int storage_current = 0;

storage = malloc(sizeof(int*) * storage_size); // later we realloc() if needed

if (file != NULL)
{
    unsigned int block_size = 10;
    unsigned int block_current = 0;

    storage[storage_current] = malloc(sizeof(int) * block_size); // realloc() when needed

    while(fgets(line, sizeof line, file) != NULL)
    {
        char * tch = strtok (line, " ");
        while (tch != NULL)
        {
            /* token is at tch, do whatever you want with it! */

            storage[storage_current][block_current] = strtol(tch, NULL);

            tch = strtok(NULL, " ");

            if (storage[storage_current][block_current] == 0)
            {
                ++storage_current;
                break;
            }

            ++block_current;

            /* Grow the array "storage[storage_current]" if necessary */
            if (block_current >= block_size)
            {
                block_size *= 2;
                storage[storage_current] = realloc(storage[storage_current], sizeof(int) * block_size);
            }
        }

        /* Grow the array "storage" if necessary */
        if (storage_current >= storage_size)
        {
            storage_size *= 2;
            storage = realloc(storage, sizeof(int*) * storage_size);
        }
    }
}

В конце вам нужно освободить память:

for (unsigned int i = 0; i <= storage_current; ++i)
    free(storage[i]);
free(storage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...