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编写代码,还是先用path编写代码——只有第一个能正常工作,第二个只会在调用fgets时产生胡言乱语。fclose返回0。我查看第二个文件的具体方式似乎并不影响它。这里发生了什么?

不要strcat()

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

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);

最新更新