0

我已经搜索了整个网络上的大多数 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后崩溃。但是,当我在调试模式下运行它时,它可以工作。filep不返回 NULL,它会打印内存地址。在 printf 之后我有另一个 fopen 并且在调试模式下它也可以工作。谁能帮我理解发生了什么?文件在那里,权限是正确的。这是代码的较新版本,但之前在一些未跟踪的更改之前,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,因为它不打印指针。

4

2 回答 2

0

我猜sizeof()用来确定所需的空间pfname是错误的。我应该有 和 的声明,pathfname可以肯定的是,它们要么是指针,那么您将获得指针大小(4 或 8),或者它们是数组,然后您将获得完整的数组大小。改为使用malloc(strlen(path)+strlen(fname)+1)

于 2013-06-27T15:24:13.287 回答
0

问题是这一行:

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以所需的目录分隔符结尾。否则,需要通过为 分配一个额外的 charpfname并连接 a来计算\

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

于 2013-06-27T15:26:29.013 回答