2010-09-20 2 views
3

Я сделал много простых процедур, но я только пытаюсь прочитать первое слово в char word[30] из каждой строки текстового файла.Как читать только первое слово из каждой строки?

Я пробовал, но безуспешно. О, я должен повторно использовать этот символ каждый раз, когда я его читаю. (Вносить упорядоченный список каждый раз, когда я его читаю).

Может ли кто-нибудь показать мне способ читать этот путь из файла простым и «чистым» способом?

FILE *fp; 
char word[30]; 
fp = fopen("/myhome/Desktop/tp0_test.txt", "r"); 
if (fp == NULL) { 
    printf("Erro ao abrir ficheiro!\n"); 
} else { 
    while (!feof(fp)) { 
     fscanf(fp,"%*[^\n]%s",word);//not working very well... 
     printf("word read is: %s\n", word); 
     strcpy(word,""); //is this correct? 
    } 
} 
fclose(fp); 

Например, для файла, который содержит:

word1 word5 
word2 kkk 
word3 1322 
word4 synsfsdfs 

печатает только это:

word read is: word2 
word read is: word3 
word read is: word4 
word read is: 

ответ

1
so ross$ expand < first.c 
#include <stdio.h> 

int main(void) { 
    char line[1000], word[1000]; 

    while(fgets(line, sizeof line, stdin) != NULL) { 
    word[0] = '\0'; 
    sscanf(line, " %s", word); 
    printf("%s\n", word); 
    } 
    return 0; 
} 

so ross$ ./a.out < first.c 
#include 

int 
char 

while(fgets(line, 
word[0] 
sscanf(line, 
printf("%s\n", 
} 
return 
} 

Update: Хорошо, вот один, что просто использует scanf(). На самом деле scanf не справляется с дискретными строками, и вы теряете возможность избежать переполнения буфера слов, установив буфер буфера на тот же размер, что и буфер строки, , но, для чего он стоит ...


so ross$ expand < first2.c 
#include <stdio.h> 

int main(void) { 
    char word[1000]; 

    for(;;) { 
    if(feof(stdin) || scanf(" %s%*[^\n]", word) == EOF) 
     break; 
    printf("%s\n", word); 
    } 
    return 0; 
} 

so ross$ ./a.out < first2.c 
#include 
int 
char 
for(;;) 
if(feof(stdin) 
break; 
printf("%s\n", 
} 
return 
} 
+0

Спасибо за ваш ответ, я вы уже сделали с fgets, но я хотел бы сделать это также с fscanf, просто чтобы охватить все варианты. Учителя также говорят, что варианты scanf более элегантны;), а также более «хитрые», я думаю. Если кто-то хочет внести свой вклад, продолжайте. – neverMind

10

Просто поменять спецификации преобразования в строке формата

 // fscanf(fp,"%*[^\n]%s",word);//not working very well... 
      fscanf(fp,"%s%*[^\n]",word); 

прочитайте первое слово и игнорировать остальные, а не игнорировать эту строку и прочитать первое слово.


Редактировать некоторое объяснение

% s игнорирует пробелы, поэтому, если входной буфер имеет «сорок два», зсапЕ игнорирует первое место, копии «сорок» к месту назначения и покидает буфер Позиционируется в пространстве перед «двумя»

% * [^ \ n] игнорирует все до новой строки, за исключением новой строки. Таким образом, буфер, содержащий «один \ n два», позиционируется в новой строке после сканированияf (как если бы это было «\ n two»)

+0

можно прочитать всю строку, используя fscanf (...) в одном выражении, используя такое регулярное выражение. Заранее спасибо. –

0

Посмотрите на это, strtok Функция - это то, что нам нужно. Вы можете сказать, где можно разделить строку с параметрами, например strtok (singleLine," ,'(");. Здесь будет резать каждый раз видеть белое пространство «,» «"»и (. strtok (singleLine," "); или просто в белых пространствах.

FILE *fPointer,*fWords,*fWordCopy; 
char singleLine[150]; 

fPointer= fopen("words.txt","r"); 
fWordCopy= fopen("wordscopy.txt","a"); 

char * pch; 
while(!feof(fPointer)) 
{ 
    fgets(singleLine,100,fPointer); 
    pch = strtok (singleLine," ,'("); 
    fprintf(fWordCopy,pch); 
    fprintf(fWordCopy, "\n"); 
} 

fclose(fPointer); 

Results

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