C文件处理错误

时间:2012-10-15 17:37:52

标签: c file file-handling

我正在为学校项目制作一个c测验程序。我将问题和答案存储在一个文本文件中。该文本文件包含1个问题,然后是4个选项和一个正确答案(每个都在一个新行中)和等等。文件处理的代码是

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
void main()
{
int tnum=2,mnum;
printf("Enter a file name to load the quiz from or enter dhruv.txt to load the default file\n");
printf("(For type of file and arrangement of data in it, refer to the documentation\n");
printf("WARNING: An improper quiz file may result in malfunctioning of the program.\n");
char quizfile[100];
scanf("%s",quizfile);
FILE *dj;
dj = fopen(quizfile,"r");
int test = 1;
while(dj == NULL)
{
    printf("Requested file does not exist.Please enter a valid name\n");
    scanf("%s",quizfile);
    dj = fopen(quizfile,"r");
    test++;
    if(test == 5)
    {
    exit(0);
    }
}
char line[500];
char ques[20][500],ansa[20][500],ansb[20][500],ansc[20][500],ansd[20][500],anse[20][500];
int start = 1,quesval=1,ans1=1,ans2=1,ans3=1,ans4=1,ans5=1;
while(fgets(line,sizeof line,dj) != NULL)
{
    if((start%6) == 1)
    {
        strcpy(ques[quesval],line);
        quesval++;
    }
    if((start%6) == 2)
    {
        strcpy(ansa[ans1],line);
        ans1++;
    }
    if((start%6) == 3)
    {
        strcpy(ansb[ans2],line);
        ans2++;
    }
    if((start%6) == 4)
    {
        strcpy(ansc[ans3],line);
        ans3++;
    }

    if((start%6) == 0)
    {
        strcpy(anse[ans5],line);
        ans5++;
    }

    if((start%6) == 5)
    {
        strcpy(ansd[ans4],line);
        ans4++;
    }

    start++;

}
fclose(dj);
printf("Quiz file successfully loaded\n");
printf("/t/t WELCOME TO THE QUIZ\n\n");
printf("Every team must select one of the four correct answers to the asked questions to gain points\n");
printf("Wrong answer will not be penalized\n");
for(int k =1;k<quesval;k++)
{
    int myvar;
    myvar = k%tnum;
    if(myvar == 0)
    {
        myvar = tnum;
    }
    printf("Question for TEAM %d\n\n",myvar);
    printf("%s \n A.%s B.%s C.%s D.%s\n",ques[k],ansa[k],ansb[k],ansc[k],ansd[k]);
}
getch();
}

问题是

        if((start%6) == 0)
    {
        strcpy(anse[ans5],line);
        ans5++;
    }

程序显示文件不存在如果我使用它但是一旦我评论出来该程序工作正常。我不知道错误是什么。请帮忙

编辑:我的文本文件如下:

Who is the owner
dhruv
jain
kalio
polika
dhruv
who is his friend
sarika
katrina
jen
aarushi
aarushi
where is he
home
office
college
toilet
office
where will he go
home
office
college
toilet
home

修改 我使用DOSBOX在Windows 7中使用Turbo c ++。脚本在上面更新

2 个答案:

答案 0 :(得分:1)

很难说没有看到你的输入文件,但我怀疑你的数组声明是倒退的。例如,您有:

 char ques[500][20];

这声明了一个包含500个元素的数组,其中每个元素最多可包含20个字符。你可能想要:

 char ques[20][500];

这声明了一个包含20个元素的数组,其中每个元素最多可以包含500个字符。

如果您的输入文件包含超过20个字符的行,那么您当前的代码可能会覆盖您的数组。

答案 1 :(得分:0)

这里有几个问题,但你的问题是:

strcpy(anse[ans5],line);

(以及所有其他类似strcpy的调用。)

您正在从[[1] [0]开始将行复制到数组。如果行包含超过20个字符,它将覆盖超过anse结尾的内存。例如,如果行包含25个字符,您将通过anse [1] [24]将它放在anse [1] [0]中。不幸的是,anse [1] [24]不存在,因为anse只有20个字符长。如果任何问题超过20个字符,您将破坏内存并可能导致崩溃。我猜:问题5超过19个字符,对吧?

简而言之,您的声明中会混淆行和列。我想你想要允许20个问题,每个问题500个字符,但你实际上允许500个问题,每个问题20个字符。

下一个问题:在C中,数组是从零开始的,而不是从一开始的。例如,问题中的第一个字符串是ques [0],而不是问题[1]。

为简化此操作,请将二维数组视为由行和列组成的表。例如,声明一个名为foo的3x4数组:

char foo[3][4];

想象一下:

   0 1 2 3
0  . . . .
1  . . . .
2  . . . .

我所拥有的是一个包含三个字符串的数组,每个字符串长度为4个字符。我的数组中的第一个字符串是foo [0]。第一个字符串的第一个字符是foo [0] [0]。第二个字符在foo [0] [1],第三个字符串的第二个字符是foo [2] [1],依此类推。

要解决此问题,您的声明应如下所示:

char ques[20][500],ansa[20][500],ansb[20][500],ansc[20][500],ansd[20][500],anse[20][500];
int start = 1,quesval=0,ans1=0,ans2=0,ans3=0,ans4=0,ans5=0;

当你开始工作时,你应该问问自己,为什么你在每次通过循环时只测试一次启动六次的值。这里有一个更好的解决方案。考虑一个像这样的三维数组:

char answers[20][500][5];

这会给你20个问题,每个问题有5个答案。