如果没有在调试模式下运行,fopen in c不起作用

时间:2013-06-27 15:16:13

标签: c memory visual-studio-2012 fopen visual-studio-debugging

我在整个网络上搜索了大多数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,因为它不会打印指针。

2 个答案:

答案 0 :(得分:0)

使用sizeof()确定pfname所需的空间是错误的我猜。我应该确定pathfname的声明,但要么它们是指针,那么你会得到指针大小(4或8)或它们是数组,那么你将获得完整的数组尺寸。请改用malloc(strlen(path)+strlen(fname)+1)

答案 1 :(得分: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以所需的目录定界符字符结束。否则,需要通过为pfname分配额外的字符并连接\来计算。

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