我抓了一个网站来获得一些mcqs用于c任务。我将数据写入一个纯文本文件,用空字符分隔每个条目。
模式是:
Question with choices NULL Answer NULL Question...
以下是该文件的示例。红点是'\0'
字符:
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;
}
输出:
我错过了什么?请帮忙。似乎缓冲区没有正确终止,并且保留了上次分配的字符。
PS:有没有更好的方法从c中使用这些数据?通过python完成刮擦。
编辑:我现在意识到编写一个单独的answerkey文件会好得多。愚蠢的我。答案 0 :(得分:2)
strcpy(questions[k].question,buffer);
对于您阅读的每个字符执行此语句(如果c
为奇数)。此时,buffer
尚未终止(而不是字符串)。
ch = getc(fp);
buffer[i]=ch;
即使到达文件末尾,这两行也会写入buffer[i]
。您只需在处理完{1}}后检查它是否为普通字符。
EOF
这是多余的。如果i++;
if(ch=='\0'){
buffer[i]='\0';
为ch
,则您'\0'
中的buffer
空终止了buffer[i]=ch;
。无需添加其他'\0'
。
答案 1 :(得分: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;
}