代码执行指定分支却输出至错误文件?求技术排查
问题根源与解决方案
哈哈,这个坑我当年刚学C的时候也踩过!你这是把freopen的用法完全搞错啦~
核心错误:误解了freopen的作用
freopen根本不是用来创建多个独立输出流的工具——它的唯一作用是修改已经存在的标准流(比如stdout、stdin)所关联的文件。你以为调用两次freopen就能得到两个分别指向不同文件的指针,但实际上这两个指针指向的是同一个标准流stdout,最后一次freopen会覆盖之前的关联。
看你这段代码:
tempfilebig = freopen ("tempbig.txt","w",stdout); tempfilesmall = freopen ("tempsmall.txt","w",stdout);
- 第一次调用
freopen,把stdout和tempbig.txt绑定,返回的tempfilebig其实就是stdout本身的指针; - 第二次调用
freopen,直接把stdout的关联文件改成了tempsmall.txt,返回的tempfilesmall还是stdout的指针。
这时候tempfilebig和tempfilesmall本质上是同一个东西——都指向stdout。不管你用哪个指针调用fprintf,实际都是往当前stdout关联的文件写。你说内容写到了tempbig.txt,大概率是之后你又用freopen把stdout改回了tempbig.txt,或者缓冲区刷新的时机导致了混淆,但核心逻辑错了是肯定的。
正确的做法:用fopen创建独立文件指针
想要同时往两个不同文件写,直接用fopen分别打开它们就好,完全没必要动stdout:
// 分别打开两个独立的文件 FILE *tempfilebig = fopen("tempbig.txt", "w"); FILE *tempfilesmall = fopen("tempsmall.txt", "w"); // 之后按需求写入对应的文件 if (/* 符合big的条件 */) { fprintf(tempfilebig, "\n%s", str); } else if (vowel == smallv) { fprintf(tempfilesmall, "\n%s", str); } // 记得用完关闭文件,确保内容写入磁盘 fclose(tempfilebig); fclose(tempfilesmall);
这样两个文件指针完全独立,写入操作不会互相干扰,再也不会出现写错文件的问题。
内容的提问来源于stack exchange,提问作者Michael Cruz
相关产品推荐
相关产品推荐

