我在整个网络上搜索了大多数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,因为它不会打印指针。
答案 0 :(得分:0)
使用sizeof()
确定pfname
所需的空间是错误的我猜。我应该确定path
和fname
的声明,但要么它们是指针,那么你会得到指针大小(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
分配额外的字符并连接\
来计算。
相同的逻辑将适用于编译的后续文件逻辑。