Как прочитать только первое слово из каждой строки? - PullRequest
3 голосов
/ 21 сентября 2010

Я сделал много простых процедур, но я только пытаюсь прочитать первое слово в 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: 

Ответы [ 3 ]

10 голосов
/ 21 сентября 2010

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

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

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


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

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

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

1 голос
/ 21 сентября 2010
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
}

Обновление: Хорошо, вот тот, который просто использует 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 голосов
/ 23 октября 2017

Посмотрите на это, функция 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

...