我正在尝试使用C ++读取以下文件
约翰逊60 12.50
安妮斯顿65 13.25
库珀50 14.50
Gupta 70 14.75
布莱尔55 10.50
克拉克40 18.75
肯尼迪45 20.50
布朗森60 20.00
晴天65 18.75
史密斯30 9.75
我可以很好地阅读这些名字,但是我在阅读其余部分时遇到了麻烦。如您所见,名称可以是任意长度,但最长的是7个字符。因为我正在尝试读取2d的双精度数组,所以我通过忽略该行的前7个字符来解决这个问题。但是,当我打印数组的内容时,它似乎是打印内存地址。
我不知道如何解决这个问题而不使用指针。 \
运行正常,运行后输出窗口包含正确的名称。问题出在我所拥有的地方:
store_names
它只打印内存地址。如何将名称后的两个数字读入我的read.ignore(7, '\n');
read >> payment[i][j];
cout << payment[j];
数组?
payment
答案 0 :(得分:0)
当你致电read
时,read.ignore(7, '\n');
if (read.good())
{
read >> payments[i][j];
}
已经打开并且在文件的末尾(假设这些是文件中的唯一内容,我会假设它们是)。您的下一次阅读无效,因为您在文件的末尾并且没有其他内容可供阅读。你应该努力检查之后的阅读状态,你会看到:
eof()
您还可以通过查看void store_payments(double payment[10][3])
{
read.open("Data.txt");
if (read.eof())
{
read.clear(); // clear the eof flag
read.seekg(0, ios::beg); // return to top of the file
}
}
:
store_names
或者您可以在read.ignore(7, '\n')
结束时关闭该文件。
当您致电double
时,将忽略7个字符。对于前7个字符的前两个名称,这将正常工作,但如果您遇到的名称不是,则会尝试读取不是read
的名称。再次,如果你在每次阅读后检查read.ignore(7, '\n');
if (read.good())
{
}
的状态,你会看到这个:
std::string line;
std::getline(read, line);
由于你的名字可以是可变长度,你应该首先阅读整行,然后筛选它。您可以使用std::getline
执行此操作:
line
现在cout << payment[j];
将包含类似
约翰逊60 12.50
您可以使用std::string
functions删除非数字部分,或查找空格。您可以将两个函数组合在一起,并假设名称是第一个空格的所有内容,某些内容是下一个空白区域的所有内容,其他内容是其他所有内容。
您在打印中看到内存地址的原因是因为您正在打印内存地址。
payment[j]
payment
本质上是指向payment[i][j]
中第一个元素的指针。您可能打算改为打印{{1}}。