2014-12-04 71 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