我正在尝试从一个文件中提取数据,并将每一行添加到交替的行中。 .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
答案 0 :(得分:1)
inputFile >> amountDue [0]接收的大于500的整数。需要500 555
不,不是。而不是operator>>
的工作方式。它会停止读取不适合整数的第一个字符,其中包括空格和换行符。
因此,它只读取500,然后下一个getline()
完成整数行并返回一个空字符串,然后下一个>>
读取地址行的编号,然后读取下一个{{ 1}}完成地址行。依此类推。
也就是说,您的代码不考虑每个整数后的换行符。您需要通过以下方式之一更新代码:
使用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