You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改点:

  1. 在main函数里提前打开文件,并且检查是否打开成功(这是好习惯,避免找不到文件时程序崩溃)。
  2. 修改get_coefficients的参数,增加一个ifstream&(文件流的引用),这样函数可以直接用已经打开的文件读取数据。
  3. 把get_coefficients里的open和close删掉,文件的打开和关闭统一放在main里。
  4. 给你加了#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:52:33