多次调用fread会使程序异常

时间:2013-12-17 13:00:44

标签: c fread

  

感谢您的所有建议,我解决了问题,这是函数调用溢出。是的,代码实际上是一个质量和丑陋,所以我设法清理它,我将在这里用新的代码替换代码。

这是我的最后一年项目,我正在尝试编写读取多个.c代码并修改它的ac程序,然后编译并运行它,最后读取ouput.txt并将其与ans.txt进行比较。

我遇到了一个奇怪的问题,代码没有任何警告,但是当我尝试在命令行运行它时,它只会显示一个空行。

经过一些测试,我发现如果我评论一行代码,即调用fread函数,程序将正常工作。我不明白原因以及如何解决它。

程序运行时,在命令行中应该是这样的:
C:\ batch.exe
欢迎使用批量系统
(开始处理)......

然而,我现在得到这个:
C:\ batch.exe

C:\

这是我的代码的主要部分:

int main(){
int agu = 1, fim;   // agument for controlling the program
int filesize[256];         //used on sacn()
int num = 0;                    // stores total number of files detected         
char sdir[] = "./input/", filter[]= "*.c", filename[128][256];       //Varibies used on auto-detecting
struct _finddata_t c_file;                   //Varibies used on auto-detecting
long hFile;                                  //Varibies used on auto-detecting
printf("\nWelcome to the my system");
Sleep(1000);
printf("\nPlease put all files on input folder in order to let this program read it");
Sleep(1000);
fflush(stdout);
do{                       
    _chdir(sdir);
    hFile = _findfirst(filter, &c_file);
    if (hFile != -1)
    {
        num = 0;
        do{
            sprintf(filename[num], "%s", c_file.name);
            printf("\n%s\n", filename[num]);
            num++;
        } while (_findnext(hFile, &c_file) == 0);

    }
    else{
        printf("\nNo .c files found in input folder.\nThe Program will be exit after 5 second.");
        Sleep(5000);
        return 0;
    }
    _chdir("..");
    printf("\nTotal %d file(s) will be imported", num);
    printf("\nConfirm ? (Y / N)\nYou Can Also Press Ctrl + C or Enter Q to Terminate this Program.");
    do {
        fim = getchar();
        putchar(fim);
        if (fim == 'Y' || fim == 'y')
            agu = 0;
        else if (fim == 'Q' || fim == 'q')
            return 0;
        else agu = 1;
    } while (fim != 'y' && fim != 'Y' && fim != 'N' && fim != 'n');


}while(agu==1);
mod(filename,sdir,num);  // modify , compile and run the code
printf("\nEnter Y to Start Result Comparing, or Enter N to Exit This Program.(Y/N)");
fim = 'a';
do {
    fim = getchar();
    putchar(fim);
    if (fim == 'Y' || fim == 'y')
        agu = 0;
    else agu = 1;
} while (fim != 'y' && fim != 'Y' && fim != 'N' && fim != 'n');

if (agu == 0){      //Resulting Comparing Function
    comp();
}
else{
    printf("\nThank You For Using This Software, This Program will be terminated.");
}
return 0;
 }

2 个答案:

答案 0 :(得分:1)

由于缓冲区溢出,printf() filebuff[x]可能会打印大量(不可见)垃圾:

fread()返回文件内容而不会尾随'\0'。因此,您会遇到缓冲区溢出,例如printf()之后的fread()以及strlen()scan()之后的fread()。 有两种(或可能更多)解决方案:

  • 在调用filebuff[x][fsize]='\0' 后立即在文件内容末尾设置空分隔符:

    int filesize[256]; filesize[x] = fsize; 
    

    在以C-string访问缓冲区之前。

  • 为每个文件创建一个单独的文件大小数组:

    scan()

    稍后在sizeof(char[xxx])

  • 中使用此尺寸

引起我注意的其他问题:

  • sizeof(filebuff[x]) // always returns 2048 sizeof(inputFiles[x]) // always returns 10 始终返回缓冲区的大小,而不是其内容的字符串长度。因此

    scan()
  • 在函数if (input[curr] == 'p' && input[curr + 1] == 'r' && input[curr + 2] == 'i' && input[curr + 3] == 'n' && input[curr + 4] == 't' && input[curr + 5] == 'f' ) 中:

    input[curr + 5]

    也有潜在的缓冲区溢出:如果你到达了近似文件strstr()的末尾读取了内容的结尾。更好地使用{{1}}代替。

答案 1 :(得分:0)

stdout是行缓冲的。如果您打印没有结尾\n的内容,则需要刷新stdout

printf("\nWelcome to the batching system");
fflush(stdout);  // Added line
Sleep(1000);

现在,您的程序正在等待输入,但您没有意识到,因为提示文本仍在打印缓冲区中。