首页 > 解决方案 > C中的fopen排序奇怪地影响它

问题描述

我有这个代码:

FILE *setup=fopen(strcat(cwd,"setup.txt"),"r");//navigates up to setup file

...//(doing stuff with setup)

fclose(setup);

FILE *paths=fopen(strcat(cwd,"stuff.txt"),"r");

char buff2[1024];

fgets(buff2,200,paths);


char thing[1024];

strcpy(thing,buff2);

printf(thing);

fclose(paths);

但它的执行方式不同,具体取决于我是先使用 setup 代码还是先使用路径代码 - 只有第一个可以正常工作,第二个只会在调用 fgets 时产生乱码。fclose 应返回 0。我查看第二个文件的具体方式似乎并没有影响它。这里发生了什么事?

标签: cfopen

解决方案


strcat()修改cwd.

因此,如果cwd最初包含"/home/username/",则第一次调用将其更改为"/home/username/setup.txt".

第二个调用附加到它,因此它尝试打开"/home/username/setup.txtstuff.txt". 这个文件名几乎肯定不存在,但您没有检查错误。

如果该文件名比分配给 的空间长cwd,您将获得缓冲区溢出和未定义的行为。

使用不同的变量来保存要打开的文件名。

char filename[MAXLENGTH];

sprintf(filename, "%s%s", cwd, "setup.txt");
FILE *setup = fopen(filename, "r");
...
fclose(setup);

sprintf(filename, "%s%s", cwd, "stuff.txt");
FILE *paths = fopen(filename, "r");
...
fclose(paths);

推荐阅读