C Не удается найти работающий алгоритм для чтения данных из файла в разных случаях. - PullRequest
2 голосов
/ 04 февраля 2012

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

Например:

File 1.
500 500
100
Binary

File 2.
500

d500
100
Binary

File 3.
   500
500

100
Binary

File 4.
500
500       100
Binary

...

Мне интересно получить 3 числовых значения.Я попробовал это с fgets и scanf, а также с fscanf ... и так одним.Но я нахожу при каждой попытке способ, где я не могу получить значения.

Есть ли у кого-нибудь идеи, кому я могу получить значения в каждом случае?

Редактировать

/* Jump over the identification and comment strings. */
        fseek(in, 3, SEEK_SET);
        do
        {
            fgets(line, PREAMBLE, in);
        } while(strncmp(line, "#", 1) == 0);

        /* Save the information in the structer. */
        sscanf(line, "%u %u", &imginf.width, &imginf.height);
        fgets(line, PREAMBLE, in);
        sscanf(line, "%u", &imginf.depth);
        return imginf;

Это работает, например:

File
500 500
100
Binary

Решение

Ее интересная часть кода.Теперь я думаю, что я получаю все значения.Может быть, код выглядит немного вонючим, я не уверен, что код чистый.

  while (a[2] == 0 ){
        fgets(line, 255, in);
        i = 0;
        while (line[i] != '\0') {
            if ((line[i] < '0') || (line[i] > '9')) {
                i++;
            }
            else {
                while ((line[i] >= '0') && (line[i] <= '9')) {
                    buffer[j] = line[i];
                    j++;
                    i++;   
                }
                j = 0;
                a[k] = atoi(buffer);
                printf("%d\n", a[k]);
                strcpy(buffer, "");  
                k++;
            }
        }
    }

Greetz

1 Ответ

4 голосов
/ 04 февраля 2012

Читайте посимвольные символы и анализируйте ввод самостоятельно.

Что-то вроде

do 3 times {
    ignore anything not a digit
    read number digit-by-digit
}
// input is now pointing to the 2nd non-digit
// just after the last digit of the 3rd number
// the 1st non-digit should be saved in the variable you used in the loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...