2014-12-04 73 views
2
#include <stdio.h> 
#include <string.h> 
#define KIEK 100 
#define MAXSTRING 255 

int main() 
{ 
    int i=0, l; 
    char line[MAXSTRING], duom[12], rez[12], wrd[MAXSTRING], lastchar,e; 
    FILE *f, *r; 

    puts("Iveskite ivesties failo varda:"); 
    scanf("%s", duom); 
    if ((f = fopen (duom, "r")) == NULL) 
     printf("Negalima atverti failo \"%s\"\n ", duom); 
    else 
    { 
     puts("Iveskite isvesties failo varda:"); 
     scanf("%s", rez); 
     if((r = fopen (rez, "w")) == NULL) 
      printf("Negalima sukurti rezultato failo \"%s\"\n ", rez); 
     else 
     { 
      fgets(line, MAXSTRING, f); 
      printf("%s",line); 

      do 
      { 
       e = sscanf(line, "%s", wrd); 
       printf("%s",wrd); 
       l = strlen(wrd); 
       i = i+l; 
       lastchar = line[i]; 
       printf("%c%d",lastchar,i); 
      } 
      while(lastchar != '\n'); 
     } 
     fclose(f); 
     fclose(r); 
    } 
} 

这是什么应该做的是从一个文本文件中读取行,例如:逐行逐字阅读文字。 C编程

apples and oranges 

i love trains 

这是行不通的。

然后它应该读取每个单词,直到它找到\n符号。但它总是读第一个。我该怎么办?

+0

使用调试器通过您的代码来一步一步来。你不应该在stackoverflow上发布代码,并期望其他人解决你的错误。 – 2014-12-04 15:20:36

回答

0

更换

do 
{ 
    e = sscanf(line, "%s", wrd); 
    printf("%s",wrd); 
    l = strlen(wrd); 
    i = i+l; 
    lastchar = line[i]; 
    printf("%c%d",lastchar,i); 
} 
while(lastchar != '\n'); 

//There is a need to update the `line` of 1st argument. 
for(i=0; 1==sscanf(line + i, "%s%n", wrd, &l); i = i + l){ 
    printf("%s\n",wrd); 
} 
+0

你能解释一下你的代码吗?你为什么要将sscanf与1进行比较,并且为什么要写&l你通过那个得到了什么? – 2014-12-04 15:55:52

+0

@RičardasMikelionis当'sscanf'返回'1'时,表示其中一个元素能够读取。 ('%n','&l'):'%n'设置读到该点的字符数为指针指向的int('&l')。所以它可以告诉哪里('line + i')读下一个。 – BLUEPIXY 2014-12-04 16:00:41

+0

谢谢。你真的帮了我很多。 – 2014-12-04 16:10:25

1

使用strtok()可以使用" "作为分隔符将您的界限打断。

取回线后使用fgets()使用strtok()

char *p = NULL; 
while(fgets(line,MAXSTRING,f) != NULL) 
{ 
    p = strtok(line," "); 
    while(p != NULL) 
    { 
     printf("%s ",p); /* your word */ 
     p = strtok(NULL," "); 
    } 
} 
+0

仍然有同样的问题。我不明白什么,我很清楚。 – 2014-12-04 15:24:02

1

你应该使用带有%s的fscanf,它会在每个空白块上打断,例如。空间,换行等

... 
char word[40]; 
while(fscanf(f,"%39s",word)==1) 
    puts(word); 
... 
+0

是的。我明白这一点。但是这项任务是读取行,然后从该行读取单词。 – 2014-12-04 15:43:42

+0

fscanf也在行结尾('\ n')中断,因此您的换行符是隐含的。 – user411313 2014-12-05 08:21:25