2013-09-05 3 views
0

У меня есть файл, содержащий список задач с они статус:Чтение разделенных пробелами строку из файла в одну переменную

PENDING Task number 1 
COMPLETED Task number 2 
COMPLETED Task number 3 

Я пытаюсь прочитать этот файл с помощью:

char status[10]; 
char text[1024]; 

while(fscanf(file, "%s %s", status, text) != EOF) { 
    printf("%s %s\n", status, text); 
} 

Однако вывод завершен неправильно. В текстовую переменную попадает только первое слово текста задачи. Как я могу это исправить?

+1

Использование strtok - http://man7.org/linux/man-pages/man3/strtok.3.html – jman

ответ

0
char status[10]; 
char text[1024]; 
char number[1024]; 
char i[1024]; 

while(fscanf(file, "%s %s %s %s", status, text, number, i) != EOF) { 
    printf("%s %s %s %s\n", status, text, number, i); 
} 

Если вы знаете поле «номер» всегда «число», и вы знаете, что это сопровождается междунар, вы можете сказать:

char status[10]; 
char text[1024]; 
int i; 

while(fscanf(file, "%s %s number %d", status, text, i) != EOF) { 
    printf("%s %s number %s\n", status, text, i); 
} 

или

char line[1000]; 

while(fgets(line, 1000, file)) { 
    char *p; 
    for(p = strtok(line, " \n"); p; p = strtok(p, " \n")) { 
     printf("%s ", p); 
    } 
    printf("\n"); 
} 
+0

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

+0

Затем используйте fscanf (% s) для каждого слова. Еще лучше, используйте fgets(), а затем strtok() –

0

чтения по строке в Buffer, а затем с помощью strtok() вы можете разбить их на слова ...

char *fgets(char *s, int size, FILE *stream); 

#define MAX_LENGTH 100 
File *ptr; 
char buffer[MAX_LENGTH] 
ptr=fopen("filepath","mode"); 
while(fgets(buffer,sizeof(buffer),ptr)!=EOF) 
{ 
//use strtok 
} 
0

Если вы читали ссылку, такую ​​как this one вы увидите, что вы можете использовать наборы как форматы, в том числе отрицательных наборов, которые читают, пока вход не в наборе. Это означает, что вы можете сделать что-то вроде

if (fscanf(file, "%s %[^\n]s", status, text) == 2) 
{ 
    /* Got all */ 
} 

В формате струне "%s %[^\n]s", первый %s будет читать, например, "PENDING", а вторая форматированная строка %[^\n]s будет читать оставшуюся до новой строки, и поэтому она должна быть "Task number 1".