文件处理在代码块中不起作用,但在 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 );
我正在尝试在循环中使用 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 );