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

How do I store only the number values in a 2d array from a given input file? (no pointers)

本文关键字:数组 2D 指针 文件 数字 何仅 存储 输入      更新时间:2023-10-16

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

#include <iostream>
#include <string>
#include <array>
#include <cstdlib>
#include <fstream>
using namespace std;
ifstream read;
ofstream write;
void store_names(string a [10])
{
    string storage;
    read.open("Data.txt"); //open file
    if (read.is_open()==true)// check to see if file is open
    {
        for (int i = 0; i < 10; i++)
        {
            read >> a[i];
            read.ignore(256, 'n');//store file string into array
            cout << a[i] << endl;
        }
    }
}
void store_payments(double payment [10][3])
{
    read.open("Data.txt");
    if (read.is_open() == true)
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                read.ignore(7, 'n');
                read >> payment[i][j];
                cout << payment[j];
            }
        }
    }
}
int main()
{
    string name_array[10];
    double payment[10][3];
    store_names(name_array);
    store_payments(payment);
    system("pause");
    return 0;
}

调用store_payments时,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')时,将忽略7个字符。对于前两个名称,这将正常工作,该名称长7个字符,但是如果您遇到一个没有的名称,您将尝试读取不是double的东西。同样,如果您在每次阅读后都检查read的状态,您会看到这一点:

read.ignore(7, 'n');
if (read.good())
{
}

由于您的名称可以是可变长度,因此您应该先阅读整个行,然后筛选它。您可以使用std::getline来执行此操作:

std::string line;
std::getline(read, line);

现在line将包含

之类的东西

约翰逊60 12.50

您只需使用std::string函数即可删除非数字零件,也可以查找空格。您可以将两个函数结合在一起,并假设名称是第一个空间的所有内容, something 是下一个空白的所有东西,而其他东西就是其他一切。

您在打印中看到内存地址的原因是因为您正在打印内存地址。

cout << payment[j];

payment[j]本质上是指向payment中第一个元素的指针。您可能打印payment[i][j]