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

如何在C++循环中从文件读取多行数据并保存到变量?

在C++中实现类似Java Scanner.nextInt()的顺序读取多行数据功能

嘿,我来帮你捋清楚这个问题!你想用C++实现像Java里Scanner.nextInt()那样按顺序读取文件里的多行数据到变量,你的代码思路方向是对的,但有几个小问题需要修正,我来一步步给你说明。

首先先指出你现有代码里的问题:

  • 你用getline(myFile, line)读了第一行后,后续循环里一直用atoi(line.c_str())获取a、b、c,这会导致这三个变量永远是第一行的数值,因为你没再读取后续的行。
  • double count[cases];属于变长数组,C++标准并不支持这种写法(某些编译器可能作为扩展支持,但不推荐),建议用std::vector<double>来替代。
  • 你的读取逻辑没对应上“按顺序读取多行数据”的需求,其实C++的文件流本身就支持像Scanner那样直接读取整数,不用先读整行再转换。

方法一:直接用文件流读取整数(最接近Java Scanner的写法)

C++的std::ifstream的>>运算符会自动跳过所有空白字符(包括换行、空格、制表符),所以不管数据是一行一个还是一行多个,都能按顺序读取,和Scanner.nextInt()的行为几乎一致。

修正后的代码示例:

#include <iostream>
#include <fstream>
#include <vector> // 用vector替代变长数组

using namespace std;

int main() {
    int cases;
    int a, b, c;
    ifstream myFile("input.in");

    if (myFile.is_open()) {
        // 先读取测试用例数
        myFile >> cases;
        cout << "cases : " << cases << "\n";

        // 用vector存储结果,替代变长数组
        vector<double> count(cases);

        // 循环读取每组a、b、c
        for (int i = 0; i < cases; ++i) {
            // 直接从文件流读取三个整数,自动跳过换行/空格
            myFile >> a >> b >> c;
            cout << a << " " << b << " " << c << "\n";
            
            // 这里可以把处理后的值存入vector
            // count[i] = 你的计算结果;
        }
        myFile.close(); // 记得关闭文件
    } else {
        cout << "无法打开文件!" << endl;
    }
    return 0;
}

方法二:按行读取并解析(适合每行固定格式的场景)

如果你的文件里每行是一组数据(比如每行三个整数),可以用getline读取整行,再用istringstream把行内容拆分成整数,这种方式更灵活,能处理复杂的行内格式。

示例代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <sstream> // 用于istringstream

using namespace std;

int main() {
    int cases;
    int a, b, c;
    string line;
    ifstream myFile("input.in");

    if (myFile.is_open()) {
        // 先读取第一行的cases数
        getline(myFile, line);
        cases = stoi(line); // 用stoi替代atoi,更符合C++风格
        cout << "cases : " << cases << "\n";

        vector<double> count(cases);

        for (int i = 0; i < cases; ++i) {
            // 读取当前行
            getline(myFile, line);
            // 把行内容转换成输入流
            istringstream iss(line);
            // 从流中读取三个整数
            iss >> a >> b >> c;
            cout << a << " " << b << " " << c << "\n";
        }
        myFile.close();
    } else {
        cout << "无法打开文件!" << endl;
    }
    return 0;
}

额外说明

  • 推荐用stoi替代atoi,因为stoi是C++标准库函数,支持更多类型转换,还能抛出异常处理错误。
  • 记得用完文件流后调用close(),或者让ifstream对象在作用域结束时自动销毁(它的析构函数会自动关闭文件)。

内容的提问来源于stack exchange,提问作者bamsarts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:46:06