【问题标题】:fopen ordering in C affecting it strangely [closed]C中的fopen排序奇怪地影响它[关闭]
【发布时间】:2020-08-05 16:45:04
【问题描述】:

我有这个代码:

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。我查看第二个文件的具体方式似乎并没有影响它。这里发生了什么?

【问题讨论】:

  • 发布Minimal, Reproducible Example。检查fopen()s 是否成功。 strcat() 会修改cwd 的内容。您是否在每个strcat() 之前正确初始化cwd?还要注意printf(thing); 是危险的,因为thing 可能包含%

标签: c fopen


【解决方案1】:

不要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"

【讨论】:

  • 啊,谢谢,我是 C 新手,总是忘记一切如何以奇怪的方式影响其输入
  • 不,这并不奇怪。都记录在案了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多