gpt4 book ai didi

c - 如果不运行在 Debug模式下,c 中的 fopen 将无法工作

转载 作者:行者123 更新时间:2023-11-30 17:50:18 24 4
gpt4 key购买 nike

我在网上搜索了大部分 fopen 问题,但没有结果。我正在尝试使用 fopen 打开文件。以下是我的代码的一部分:

FILE *filep = NULL;
FILE *Compilation = NULL;
printf("%s\n", fname);
char *pfname = (char*)malloc(sizeof(path) + sizeof(fname));
pfname = concat(path, fname);
printf("%s\n", pfname);
filep = fopen(pfname,"r");
if (filep == NULL){
printf("opening file failed: %s\n", strerror(errno));
}
printf("%p\n", filep);

我使用 Visual Studio Express 2012 作为我的 IDE。当我在没有调试的情况下运行它时。打印连接的 pfname 后它会崩溃。但是,当我在 Debug模式下运行它时,它可以工作。 filep不返回NULL,它将打印内存地址。我在 printf 之后还有另一个 fopen,在 Debug模式下它也可以工作。谁能帮助我了解发生了什么事?文件在那里,权限是正确的。这是代码的较新版本,但之前在一些未跟踪的更改之前,fopen 可以工作。提前致谢。

<小时/>

修改后的代码

FILE *filep = NULL;
FILE *Compilation = NULL;
printf("%s\n", fname);
char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1);
pfname = concat(path, fname);
printf("%s\n", pfname);
filep = fopen(pfname,"r");
if (filep == NULL){
printf("opening file failed: %s\n", strerror(errno));
}
printf("%p\n", filep);
char *newfile = (char*)malloc(strlen(path) + 11);
newfile = concat(path, "Result.txt");
Compilation = fopen(newfile, "a");

它仍然无法通过 fopen,因为它不打印指针。

最佳答案

问题出在这一行:

char *pfname = (char*)malloc(sizeof(path) + sizeof(fname));

C中的sizeof函数是数据类型的大小。在这种情况下,数据类型是指针(我假设)。所以在 32 位系统上是 4,在 64 位系统上是 8。我在 StackOverflow.com 上多次看到过这种对 sizeof 含义的误解。

要纠正它,您需要:

char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1);

因为您的最终字符串(pfname 指向)必须是两个字符串的长度,加上保存零终止符的字节。

您现有的线路:

pfname = concat( path, file );

覆盖放入pfname中的已分配指针。新文件路径应按如下方式计算:

strcpy( pfname, path );   // Copy the path to the newly allocated file path buffer
strcat( pfname, file ); // Concatenate the file name to the path

我假设 path 以所需的目录定界符字符结尾。否则,需要通过为 pfname 分配一个额外的字符并连接 \ 来计算。

相同的逻辑将应用于您后续的编译文件逻辑。

关于c - 如果不运行在 Debug模式下,c 中的 fopen 将无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17346995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com