2010-09-20 8 views
3

J'ai fait beaucoup de procédures simples, mais j'essaie seulement de lire le premier mot dans un char word[30], à partir de chaque ligne d'un fichier texte.Comment lire seulement le premier mot de chaque ligne?

J'ai essayé, mais sans succès. Oh, je dois réutiliser cet omble chaque fois que je le lis. (Pour mettre dans une liste ordonnée chaque fois que je l'ai lu).

Quelqu'un peut-il me montrer un moyen de lire de cette façon à partir d'un fichier, d'une manière simple et «propre»?

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); 

Par exemple, pour un fichier qui contient:

word1 word5 
word2 kkk 
word3 1322 
word4 synsfsdfs 

il imprime seulement ceci:

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

Répondre

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 
} 

Mise à jour: Ok, voici un qui utilise simplement scanf(). Vraiment, scanf ne gère pas bien les lignes discrètes et vous perdez l'option d'éviter le débordement de tampon de mots en définissant le tampon de mot à la même taille que le tampon de ligne, mais, pour ce que ça vaut ...


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

Merci pour votre réponse, je J'ai déjà fait des fgets, mais je voudrais le faire aussi avec fscanf, juste pour couvrir toutes les options.Les enseignants disent aussi que les variantes de scanf sont plus élégantes;) et aussi plus "rusé" je suppose. Si quelqu'un veut contribuer, allez-y. – neverMind

10

Juste les spécifications permuter de conversion dans votre chaîne de format

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

lire le premier mot et ignorer le reste, plutôt que d'ignorer la ligne et lire le premier mot.


Modifier une explication

% s ne tient pas compte des espaces, donc si le tampon d'entrée a « quarante-deux », scanf ne tient pas compte du premier espace, copies « quarante » à la destination et laisse le positionné tampon à l'espace avant "deux"

% * [^ \ n] ignore tout jusqu'à un retour à la ligne, à l'exception du saut de ligne. Donc un tampon contenant "un \ n deux" est positionné à la ligne après le scanf (comme si c'était "\ n deux")

+0

pouvons-nous lire la ligne entière en utilisant fscanf (...) dans une déclaration en utilisant ce genre de regex. Merci d'avance. –

0

Jetez un coup d'oeil à ceci, strtok fonction est ce dont nous avions besoin. Vous pouvez dire à la fonction où diviser la chaîne avec des paramètres, comme strtok (singleLine," ,'(");. Ici, il coupera chaque fois qu'il voit l'espace blanc « , » « ' » et (. strtok (singleLine," "); ou tout simplement dans les espaces blancs.

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

Questions connexes