2015-10-24 50 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