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);
我有这个代码:
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);