Использование fgets () при разборе файла - PullRequest
1 голос
/ 22 октября 2011

У меня есть файл, который содержит несколько строк.

Я токенизирую файл, и если токен содержит .word, я хотел бы сохранить оставшуюся часть строки в c-строке.

Так что если: array: .word 0:10 Я хотел бы хранить 0:10 в c-строку.

Я делаю следующее:

if (strstr(token, ".word")) {
    char data_line[MAX_LINE_LENGTH + 1];
    int word_ret = fgets(data_line, MAX_LINE_LENGTH, fptr);
    printf(".word is %s\n", data_line);
}

Проблема в том, что fgets() захватывает следующую строку. Как бы я взял оставшуюся часть текущей строки? Это возможно?

Спасибо,

Ответы [ 3 ]

3 голосов
/ 22 октября 2011

strstr () возвращает указатель на то, где находится первый символ ": word".

Это означает, что если вы добавите к этому длину слова ": word" (5 символов), вы получите указатель на символы после слова ": word", то есть желаемой строки.

char *x = strstr(token, ".word");
char *string_wanted = x + 5;
1 голос
/ 22 октября 2011

Вы должны уже прочитать входные данные в буфер, который, я предполагаю, равен token , и оттуда вы просто копируете из возвращаемого значения strstr + длину ".word" вконец буфера.Вот что я бы сделал:

char *location = strstr(token, ".word");
if (location != NULL) {
   char data_line[MAX_LINE_LENGTH];
   strncpy(data_line, location + 5, MAX_LINE_LENGTH);
   printf(".word is %s\n", data_line);
}

Вы можете добавить 5 или 6 к указателю location (в зависимости от того, будет ли пробел после ".word"), чтобы получить остаток строки.

Также обратите внимание, что параметр size в strncpy и fgets включает в себя место для завершающего символа NUL.

1 голос
/ 22 октября 2011

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

Далее, имея целую строку, у вас есть несколько вариантов: если формат строки фиксированный (что-то вроде «.word»), то вы можете использовать результат функции «strstr», чтобы найти начало «.word», продвижение 6 символов (включая пробел) и напечатайте искомое слово из найденной позиции.

Другой вариант более сложный, но на самом деле он немного лучше. Использует функцию "strtok".

...