如何仅在给定输入文件的二维数组中存储数值? (没有指针)

时间:2017-11-29 23:29:04

标签: c++

我正在尝试使用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

1 个答案:

答案 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}}。