Читайте файл, пока не появится символ в C - PullRequest
4 голосов
/ 15 апреля 2010

Скажите, у меня есть файл в формате:

key1/value1
key2/value2
key3/value3
....

Скажем, у меня есть массив для хранения этих значений:

char *data[10][10]

Как мне прочитать этот файл и получить ключи key1, key2 и key3 в data [0] [0], data [1] [0] и data [2] [0]. Затем поместите значение1, значение2 и значение3 в данные [0] [1], данные [2] [1] и данные [3] [1]. Так что на самом деле я хочу получить строки ключа key1-key3 по отдельности, затем проверить наличие символа '/', а затем получить строки значения 1-3. Кстати, когда я вношу их в файл, я включаю символ '\ n', чтобы вы могли проверить это, чтобы проверить на новую строку.

1 Ответ

5 голосов
/ 15 апреля 2010

Лучший способ - прочитать данные по строке в буфер, а затем проанализировать буфер. Это может быть расширено до чтения в больших блоках данных.

Используйте fgets для чтения данных в буфер.

Используйте strchr, чтобы найти символ разделителя.

Пример:

#include <stdio.h>
#include <stdlib.h>

#define MAX_TEXT_LINE_LENGTH 128


int main(void)
{
    FILE *  my_file("data.txt", "r");
    char    text_read[MAX_TEXT_LINE_LENGTH];
    char    key_text[64];
    char    value_text[64];

    if (!my_file)
    {
        fprintf(stderr, "Error opening data file:  data.txt");
        return EXIT_FAILURE;
    }
    while (fgets(text_read, MAX_TEXT_LINE_LENGTH, my_file))
    {
        char * p;
        //----------------------------------------------
        //  Find the separator.
        //----------------------------------------------
        p = strchr('/');

        key_text[0] = '\0';
        value_text[0] = '\0';

        if (p != 0)
        {
            size_t  key_length = 0;
            key_length = p - text_read;

            //  Skip over the separator
            ++p;
            strcpy(value_text, p);

            strncpy(key_text, text_read, key_length);
            key_text[key_length] = '\0';

            fprintf(stdout,
                    "Found, key: \"%s\", value: \"%s\"\n",
                    key_text,
                    value_text);
        }
        else
        {
            fprintf(stdout,
                    "Invalid formatted text: \"%s\"\n",
                    text_read);
        }
    } // End:  while fgets
    fclose(my_file);

    return EXIT_SUCCESS;
}

Примечание. Приведенный выше код не был скомпилирован и не проверен, но приведен только для иллюстрации.

...