c - 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。我查看第二个文件的具体方式似乎并没有影响它。这里发生了什么事?
解决方案
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);
推荐阅读
- html - CSS 媒体查询不响应给定的最大宽度或最小宽度
- python - 为什么 PIL 经常与 Pytorch 一起使用?
- javascript - 如何使用快速服务器在nodejs中将zip文件后端发送到前端
- sql-server - SSIS 文件存在检查工作在 SSDT 中未从 SSISDB 运行
- javascript - toggleClass 函数在此函数中不起作用
- angular - 尽管 Angular 中的表单已重置,但输入字段仍标记为红色
- django - request.POST 上的 django 单选按钮不起作用
- python - 使用“object”类型的 numpy 数组创建混合类型的 Pandas 数据框
- angular - 使用 Angular 9 CLI 创建新项目时如何解决纱线问题?
- spring - Spring 与消费者和 Nifi 的集成作为调度程序