C 中的 fopen 排序会奇怪地影响它

fopen ordering in C affecting it strangely

我有这个代码:

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

但它的执行方式不同,这取决于我是先使用设置代码还是先使用路径代码 - 只有第一个可以正常工作,第二个只会在调用 fgets 时产生乱码。 fclose returns 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 的 space 长,您将遇到缓冲区溢出和未定义的行为。

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

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