如何交替从文件中获取一行数据和一个整数?

How can I alternate taking one line of data from a file and one integer?

本文关键字:数据 整数 一个 一行 何交替 文件 获取      更新时间:2023-10-16

>我正在尝试从一个文件中提取数据并将每一行添加到交替行中。示例.txt文件:

123 Main
500 555橡子
1500 23史密斯维尔
1540


我有一个地址数组来保存字符串和 amountdue 数组来保存整数。理想情况下,地址[0]包含"123主",到期金额[0]包含500,依此类推。

我为此制作的函数使用 getline 来获取字符串并适用于第一个循环,但 inputFile>> amountDue[0] 接收的整数超过 500 个整数。它需要 500 555,然后下一个 getline 需要 "Acorn",下一个输入文件>>金额到期 [1] 需要 1500 23。

void loadArrays(string address[], double amountDue[], const int SIZE)
{
//Open file for data laoding
ifstream inputFile;
inputFile.open("Prog3Input.txt");
for (int i = 0; i < SIZE; i++)
{
getline(inputFile,address[i]);
inputFile >> amounDue[i];
}
}

我期望: 字符串地址[0] 是 "123 Main"int amountDue[0] 是 500 地址 [1] 是 "555 Acorn">

金额到期 [1] 是 1500

ETC。

我得到: 地址[0] 是 "123 主要" 金额到期[0] 是 500 555 地址[1] 是 "橡果"

金额到期[1] 是 1500 23
ETC

inputFile>> amountDue[0] 接收的整数超过 500。需要 500 555

不,它没有。这不是operator>>的工作方式。它停止读取不适合整数的第一个字符,其中包括空格和换行符。

因此,它只读取 500,然后下一个getline()完成整数行并返回一个空白字符串,然后下一个>>读取地址行的编号,然后下一个getline()完成地址行。等等。

也就是说,您的代码不考虑每个整数后面的换行符。您需要通过以下方式之一更新代码:

  • 使用std::istream::ignore()跳过该行的其余部分,直到换行符。

    #include <string>
    #include <fstream>
    #include <limits>
    void loadArrays(std::string address[], double amountDue[], const int SIZE)
    {
    //Open file for data loading
    std::ifstream inputFile("Prog3Input.txt");
    for (int i = 0; i < SIZE; i++)
    {
    std::getline(inputFile, address[i]);
    inputFile >> amountDue[i];
    inputFile.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    }
    }
    

    现场演示

  • 始终使用std::getline()读取每一行,然后使用std::istringstream分析整数。

    #include <string>
    #include <fstream>
    #include <sstream>
    void loadArrays(std::string address[], double amountDue[], const int SIZE)
    {
    //Open file for data loading 
    std::ifstream inputFile("Prog3Input.txt");
    std::string line;
    for (int i = 0; i < SIZE; i++)
    {
    std::getline(inputFile, address[i]);
    std::getline(inputFile, line);
    std::istringstream(line) >> amountDue[i];
    }
    }
    

    现场演示

相关文章: