2015-10-24 49 views
0

我颳了一個網站以獲取一些用於c作業的mcqs。我將數據寫入一個純文本文件,將每個條目與空字符分開。 的模式是: Question with choices NULL Answer NULL Question...在某些字符串的末尾獲取垃圾值

以下是該文件的示例。紅點是'\0'字符:

enter image description here Here是獲取完整文件的鏈接。

代碼在C閱讀本文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct Question{ 
    char question[1000]; 
    char answer; 
}; 

int main(){ 
struct Question questions[100]; 
FILE *fp; 
char buffer[1000],choice; 
int ch,i=0,c=1,k=0,score=0; 
fp=fopen("quiz_questions.txt","r"); 
ch = 1; 
    while (ch != EOF) 
    { 
    ch = getc(fp); 
    buffer[i]=ch; 
    i++; 
    if(ch=='\0'){ 
    buffer[i]='\0'; 
    c++; 
    i=0; 
    continue; 
    } 
    if(c%2){ //question 
    strcpy(questions[k].question,buffer); 


    } 
    else{ //answer 
    questions[k].answer=buffer[0]; 
    k++; 

    } 
} 



for(i=0;i<35;i++){ 
printf("\nQuestion:\n%s\nAnswer: %c\n",questions[i].question,questions[i].answer); 
} 


return 0; 
} 

OUTPUT:

Output

我缺少什麼?請幫助。看起來緩衝區並沒有正確地終止,並且保留了最後一次分配的字符。

PS:有沒有更好的方法來從c中使用這些數據?刮通過python完成。

編輯:我現在認識到寫一個單獨的答案文件會好得多。愚蠢的我。

回答

2
strcpy(questions[k].question,buffer); 

此聲明是爲你讀每一個字符執行(如果c爲奇數)。此時,buffer尚未空終止(而不是字符串)。

ch = getc(fp); 
buffer[i]=ch; 

這兩行寫buffer[i]即使達到文件的末尾。在處理它之後,您只檢查EOF,就好像它是正常字符一樣。

i++; 
if(ch=='\0'){ 
buffer[i]='\0'; 

這是多餘的。如果ch'\0',那麼您的空終止bufferbuffer[i]=ch;。沒有必要再添加'\0'

+0

的'''緩衝液[I] ='\ 0''''在絕望加入。 – thekindlyone

1

改性代碼的版本來解決此問題:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct Question{ 
    char question[1000]; 
    char answer; 
}; 

int main() 
{ 
    struct Question questions[100]; 
    FILE *fp; 
    char buffer[1000],choice; 
    int ch,i=0,c=0,k=0,score=0; **<-- EDIT:change done here to initialize c = 0** 

    fp=fopen("quiz_questions.txt","r"); 

    ch = 1; 

    while (ch != EOF) 
    { 
     ch = getc(fp); 
     buffer[i]=ch; 
     i++; 

     if(ch =='\0') 
     { 
      //buffer[i]='\0'; <-- Change done here, unnecessary assignment 
      c++; 
      i=0; 

      if(c%2)   <-- Change done here, moved inside if (ch == '\0') case 
      { 
       //question 
       strcpy(questions[k].question,buffer); 
      } 
      else 
      { 
       //answer 
       questions[k].answer=buffer[0]; 
       k++; 
      } 
     } 
    } 


    for(i=0;i<35;i++) 
    { 
     printf("\nQuestion:\n%s\nAnswer: %c\n",questions[i].question,questions[i].answer); 
    } 

    return 0; 
} 
+0

http://i.imgur.com/06LQM8r.png是它的產物。 – thekindlyone

+0

@thekindlyone,我沒有測試修改,因爲輸入的txt文件不可用。我錯過了初始化c = 0而不是c = 1(在原始代碼中)[這是因爲我在if(ch =='\ 0')loop]中移動strcpy()代碼所以需要。我已經編輯了此更改的發佈修改代碼。希望這工作正常。 – cm161

+0

哈!我錯過了這個,試圖修復它!謝謝。 – thekindlyone