Ошибка в моем использовании fscanf с классом символов - PullRequest
1 голос
/ 22 июля 2011

У меня есть текстовый файл с первой строкой, как показано ниже:

                    j0W82LBrSdUbw               

В основном в нем может быть много пробелов, горизонтальных табуляций в начале, а затем некоторые символы, содержащие цифры или алфавиты (ширина этого символа - 14 символов -исправлено), а затем может присутствовать еще некоторое пространство или вкладки.Ширина всей строки неизвестна, я имею в виду, что в ней может быть любое количество пробелов или табуляций.Я хочу пренебречь начальным и конечным пробелами, но перенести только буквы / цифры в строку.

Я попытался прочитать его, используя fscanf с классом символов, как показано ниже (я пробовал пару способов, но безуспешно), но результат неверен, он не читает и не игнорирует пробел, а сами буквы читаются.В целях тестирования я установил всю длину строки в 54 символа во всех (пробелы, цифры все символы включены)

fscanf(fin,"%54*[ ]%[^ ]%*[ ]",s);//s is char array char s[100];

и

  fscanf(fin,"%54[^ \t]",s);

1] Как мне разобрать этоиспользование fscanf, когда ширина строки фиксирована и известна, скажем, 54 символа.

2] Когда ширина строки неизвестна и переменна?

3] Где можно прочитать хорошую документацию по использованию классов символовв scanf / fscanf?

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Вы не можете использовать конструкцию [...] здесь. Это соответствует непустой последовательности символов.

Просто используйте простой формат "%s", он автоматически игнорирует пустые символы. Для дополнительной безопасности используйте "%14s", чтобы неверная строка ввода не перетекла в буфер.

1 голос
/ 22 июля 2011

Попробуйте fgetc() в цикле.Возможно, вам потребуется добавить проверку ошибок и обработку пограничных случаев.

char s[15];
size_t sndx = 0;
int ch;
while (((ch = fgetc(fin)) != '\n') && (ch != EOF) && (sndx < 15)) {
    if (sndx || !isspace((unsigned char)ch)) {
        s[sndx++] = ch;
    }
}
s[sndx] = 0;
/* discard rest of line */
while (((ch = fgetc(fin)) != '\n') && (ch != EOF)) /* void */;
...