【问题标题】:Reading In Data From A Text File And Separating Out The Data Contained In Each Line从文本文件中读取数据并分离出每一行中包含的数据
【发布时间】:2016-03-30 13:38:27
【问题描述】:

在目前的程序中,我希望从文本文件中逐行读取文本,从每一行中提取数据。文本文件中的每一行都包含一个字母,例如“A”,后跟一个冒号“:”,然后是一个整数,例如“2”。程序中应读取数据的函数目前如下所示:

void readFile()
{
std::ifstream aFile;                                                                                                                                                                                
std::string alldata;
std::string letter;                                                                                                                 
aFile.open("KeyPopularity.txt");
while (std::getline(aFile, alldata))
{                                                                                                           
    letter = alldata[0];
    for (int i = 0; i < keyboardKeys.size(); i++)
    {
        if (keyboardKeys[i].character==letter)                                                                                      
        {
            keyboardKeys[i].noOfPresses = int(alldata[2]);                                                                          
        }
        std::cout << letter << " ";
        std::cout << int(alldata[2]) << "\n";
    }
}
aFile.clear();                                                                                                                      
}

然而,位置 0 (alldata[0]) 处的 alldata 变量不是仅列出单个字符,即字母在字母之前列出了一个数字,例如 87。 87 W 而不仅仅是 W。问题是为什么会发生这种情况,有没有办法从文本文件中的每一行逐行提取数据,以获得行字符串位置 0 处的字母和位置处的数字2的行字符串?

【问题讨论】:

    标签: c++ string io ifstream


    【解决方案1】:

    你的程序中的一些观察/错误:

    • 字母是一个std::string,但是你给它分配了一个字符;这是允许的,但你确定这是意图吗?您可以使用 char 代替 string。
    • alldata[2] 是一个字符。例如,对于“A:2”行,该值将为“2”(ascii 值为 50,与值 2 不同)。您不能简单地使用 int() 将其转换为 int。要将数字字符('0'..'9')转换为其相应的整数值,您需要从 ascii 代码(或 '0')中减去值 48。
    • 还将keyboardKeys[i].character 的类型更改为char 而不是std::string

    你可以这样重写你的代码:

    void readFile()
    {
        std::ifstream aFile;
        std::string alldata;
        char letter;
        aFile.open("KeyPopularity.txt");
        while (std::getline(aFile, alldata))
        {
            letter = alldata[0];
            for (int i = 0; i < keyboardKeys.size(); i++)
            {
                if (keyboardKeys[i].character == letter)
                {
                    keyboardKeys[i].noOfPresses = alldata[2] - '0';
                }
                std::cout << letter << " ";
                std::cout << alldata[2] - '0' << "\n";
            }
        }
        aFile.clear();
    }
    

    【讨论】:

    • 再观察一下:如果从文件中读取的按下次数大于 9,那么上面的代码将不起作用,因为它只读取第一个数字。您可以调整代码,使其从 alldata 中删除前两个字符(因此键和“:”),您可以使用 alldata.erase(0, 2) 执行此操作然后您可以将生成的字符串转换为整数,使用键盘键[i].noOfPresses = stoi(alldata);但是 stoi 仅在 C++11 中可用,对于较旧的 c++,您可以使用 stdlib.h 中的旧 atol
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多