文件处理在代码块中不起作用,但在 Turbo C++ 中很好

File handling do not work in codeblocks but fine in turboC++

我正在尝试在循环中使用 fscanf 读取文件,但是当我执行它时,windows 显示 file.exe 已停止工作。从字面上看,这个程序在 turboC++ 中运行良好(使用 clrscr() 而不是 system("cls"))。我知道这两个编译器之间存在重大差异,但我无法弄清楚。请帮助我提前谢谢。

#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
   FILE *fp;
    char *c;
    system("cls");
   fp = fopen("test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   rewind(fp);
   while(!feof(fp)){
        fscanf(fp,"%s",c);
        printf("%s\n",c);
   }
   fclose(fp);
   return 0;
}

在调用 fscanf(fp,"%s",c); 之前,您还没有为 c 分配任何内存。 因此,fscanf() 尝试将数据写入调用未定义行为的任​​意地址。您应该将 c 声明为数组

char c[SOME_LENGTH+1];

或使用malloc()

c = malloc( SOME_LENGTH+1 );

此外,正如@alk hat 在他的评论中提到的,在 scanf() 中使用最大长度也更安全:

#define SOME_LENGTH 42
...
fscanf( fp, "%42s", c );

您也可以使用 Stringifcation,但您需要两级宏

#define SOME_LENGTH     42
#define STR(L)          #L
#define SCANFFMT(L)     "%" STR(L) "s"
...
fscanf( fp, SCANFFMT(SOME_LENGTH), c );