C++入门问题:如何让函数每次调用时读取文档的下一行?
解决每次读取文件同一行的问题
嘿,我完全懂你的烦恼——碰到不太给力的教授,还得自己啃这些问题,太难受了!咱们直接说问题:你每次调用get_coefficients函数时,都会重新打开textinputs.txt,而每次打开文件,读取的位置都会自动回到文件开头,所以不管循环多少次,读的都是第一行的a、b、c值。
下面给你两个超基础的解决办法,都是学校作业允许的简单操作:
方法1:在main函数里打开文件,把文件流传给函数(推荐)
这个方法更规范,也符合编程的最佳实践。核心思路是:文件只打开一次,循环过程中一直用同一个文件流读取数据,这样每次读取后,文件的读取指针会自动移到下一组数据的位置。
修改后的代码如下:
#include <iostream> #include <fstream> #include <string> #include <cmath> // 别忘了加这个,sqrt函数需要它! using namespace std; // 显示指令的函数不变 void display_instructions() { cout << "Enter a, b, c: "; } // 修改get_coefficients:接收一个ifstream的引用,不再自己打开/关闭文件 void get_coefficients(double& a, double& b, double& c, ifstream& inputsFile) { inputsFile >> a >> b >> c; cout << a << " " << b << " " << c << endl; // 加空格,输出更清晰 } // 下面的计算函数不变 double calc_discriminant(double a, double b, double c) { double discriminant = (b * b) - (4 * a * c); return discriminant; } double calc_root_1(double a, double b, double c, double disc) { double r1 = ((-b) + sqrt(disc)) / (2 * a); return r1; } double calc_root_2(double a, double b, double c, double disc) { double r2 = ((-b) - sqrt(disc)) / (2.0 * a); return r2; } void display(double r1, double r2) { cout << "the roots are " << r1 << " and " << r2 << "." << endl; } int main() { ifstream inputsFile; inputsFile.open("textinputs.txt"); // 一定要检查文件是否成功打开!避免出错 if (!inputsFile.is_open()) { cout << "Error opening file!" << endl; return 1; // 出错就退出程序 } for (int i = 0; i < 3; i++) { double a, b, c; display_instructions(); // 把打开的文件流传给函数 get_coefficients(a, b, c, inputsFile); double disc = calc_discriminant(a, b, c); if (disc < 0) { cout << "No real solution" << endl; } else { double r1 = calc_root_1(a, b, c, disc); double r2 = calc_root_2(a, b, c, disc); display(r1, r2); } } inputsFile.close(); // 循环结束后再关闭文件 return 0; }
关键修改点:
- 在
main函数里提前打开文件,并且检查是否打开成功(这是好习惯,避免找不到文件时程序崩溃)。 - 修改
get_coefficients的参数,增加一个ifstream&(文件流的引用),这样函数可以直接用已经打开的文件读取数据。 - 把
get_coefficients里的open和close删掉,文件的打开和关闭统一放在main里。 - 给你加了
#include <cmath>,因为原来的代码里用了sqrt函数却没包含头文件,编译可能会报错!
方法2:用全局文件流(简单但不推荐,适合快速理解)
如果你觉得传参数有点麻烦,也可以把文件流定义成全局变量——这样所有函数都能直接用它,不用传递。不过全局变量尽量少用,因为会让代码结构变乱,但作为新手入门理解也可以。
修改后的核心部分:
// 把文件流定义在所有函数外面,变成全局变量 ifstream inputsFile; void get_coefficients(double& a, double& b, double& c) { inputsFile >> a >> b >> c; cout << a << " " << b << " " << c << endl; } int main() { inputsFile.open("textinputs.txt"); if (!inputsFile.is_open()) { cout << "Error opening file!" << endl; return 1; } // 后面的循环和原来一样,不用传参数给get_coefficients for (int i = 0; i < 3; i++) { // ... 其他代码不变 get_coefficients(a, b, c); // ... 其他代码不变 } inputsFile.close(); return 0; }
额外提醒:
- 确保
textinputs.txt里有至少3组空格(或换行)分隔的数字,比如:1 2 1 2 5 2 1 -3 2 - 每次调用
inputsFile >> a >> b >> c时,不管数据是在同一行还是不同行,都会自动读取下三个数字,所以不用纠结换行的问题。
内容的提问来源于stack exchange,提问作者polkamocha
相关产品推荐
相关产品推荐

