2009-12-12 5 views
1

Мне нужно прочитать в форматированном файле, который выглядит примерно так.Есть ли более эффективный способ чтения форматированного файла в C, чем я сделал?

Код: HARK

Имя: Oscar

MRTE: Поезд

и т.д.

На данный момент мой код выглядит следующим образом.

FILE *file; 
char unneeded[10]; 
char whitespace[2]; 
char actual[10]; 
file = fopen("scannertest.txt","r"); 
fscanf(file,"%s",unneeded); // this is the identifier and the colon (code:) 
fscanf(file,"%[ ]",whitespace); // this takes in the white space after the colon. 
fscanf(file,"%s",actual); // this is the value I actually need. 
/** 
* Do stuff with the actual variable 
**/ 
fclose(file); 

Этот способ работает для меня, но я не думаю, что пишу три fscanf() 's для каждой строки в текстовом файле это лучший способ сделать это, тем более, что я буду делать это в цикле позже.

Я пытался делать это так:

fscanf(file, "%s %[ ] %s",unneeded,whitespace,real); 

Однако это дало мне странные символы, когда я пытался напечатать выход.

ответ

0

Если вы ищете способы ускорить работу своего кода, вы можете прочитать его во всем файле или в буфере файла. Одновременное чтение всего блока будет быстрее, чем чтение данных по мере необходимости.

Затем вы можете использовать sscanf в буфере, который вы читаете.

+0

я попытался использовать sscanf на fgets() У меня было это так. fgets (строка, 20, файл); sscanf (строка, «% s% []% s, ненужные, пробельные, фактические) Но это все равно дало мне ту же проблему, странные символы, переходящие в переменные. –

+1

Звучит скорее как переполнение буфера, если вы видите странные символы. Обязательно проверьте возвращаемое значение sscanf, так что вы знаете, что он действительно что-то читал. – nos

4

%s scanf specifier уже игнорирует пробелы. Если вы

scanf("%s%s", unneeded, actual) 

и вход «Код: HARK», unneeded будет «Код:» и actual будет иметь «Арк».

Предупреждение: scanf - это трудная функция (это «сложно» безопасно использовать). Если вы хотите больше безопасности, указать максимальное количество символов (помните нулевой терминатор), которую вы готовы принять в каждую строку

scanf("%9s%9s", unneeded, actual); /* arrays defined with 10 elements */ 

Лучше всего использовать fgets с последующим sscanf.

Редактировать после прочтения комментария к другому ответу

И не забудьте * всегда * проверить возвращаемое значение scanf.

chk = scanf("%9s%9s", unneeded, actual); 
if (chk != 2) /* error reading data */; 
+0

Спасибо большое. Проблема решена :) –

1

В C, функции файлов используют буферный ввод/вывод. Это означает, что fscanf не будет бить диск с каждым вызовом, поэтому потеря производительности при использовании 3 вызовов вместо 1 должна быть незначительной.

Однако, лучше всего сделать, это получить программу, работающую, а затем, если это слишком медленно мера, где узкие места производительности являются и исправить их первым. Не стоит пытаться угадать, какие разделы кода вызовут проблемы с производительностью.

0

Я больной человек, который время от времени пропускает кодирование в C. Я написал то, что похоже на работу:

Содержание test.txt

Code: HARK 
Name: Oscar 
MRTE: Train 

Содержание text.c

#include <stdio.h> 

#define MAX_LEN 256 

int main(void) 
{ 
    FILE *file; 
    char str_buf[MAX_LEN + 1]; // One extra byte needed 
          // for the null character 
    char unneeded[MAX_LEN+1]; 
    char actual[MAX_LEN+1]; 


    file = fopen("test.txt","r"); 

    while(fgets(str_buf, MAX_LEN + 1, file) != NULL) 
    { 
    sscanf(str_buf, "%s%s", unneeded, actual); 
    printf("unneeded: %s\n", unneeded); 
    printf("actual: %s\n", actual); 
    } 

    return 0; 
} 

Вывод скомпилированного кода:

unneeded: Code: 
actual: HARK 
unneeded: Name: 
actual: Oscar 
unneeded: MRTE: 
actual: Train 
1

Ваш код не работает, потому что

не делает то же самое, как

fscanf(file,"%s %[ ] %s", unneeded, whitespace, actual); 

это функционально эквивалентно

fscanf(file,"%s%[ ]%s", unneeded, whitespace, actual); // No spaces in fmt string 

НТН

 Смежные вопросы

  • Нет связанных вопросов^_^