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

时间:2019-09-07 04:26:00

标签: c++ ifstream getline

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

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

我有一个地址数组来保存字符串,而amountDue数组来保存整数。理想情况下,地址[0]持有“ 123 Main”,而amountDue [0]持有500,依此类推。

为此我使用的函数使用getline获取字符串并在第一个循环中工作,但是inputFile >> amountDue [0]接收的大于500个整数。它需要500 555,然后下一个getline需要“橡子”,而下一个inputFile >> amountDue [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橡子”
amountDue [1]是1500
ETC。

我得到: 地址[0]是“ 123 Main”
amountDue [0]是500555
地址[1]是“橡子”
amountDue [1]是1500 23
ETC

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

  • 使用getline()跳过其余的行,直到换行。

    std::istream::ignore()

    Live demo

  • 始终使用#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

    Live demo