从文本文件中读取数据并分离出每行中包含的数据

时间:2016-03-30 13:38:27

标签: c++ string io ifstream

在程序中,我希望逐行从文本文件中读取文本,从每行中提取数据。文本文件中的每一行都包含一个字母,如“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变量(alldata [0])而不是仅列出单个字符,即字母在字母之前列出诸如87之类的数字。 87 W而不仅仅是W.问题是为什么会发生这种情况并且有一种方法可以逐行从文本文件中的每一行中提取数据,以获得行字符串位置0处的字母和位置处的数字2行的字符串?

1 个答案:

答案 0 :(得分:1)

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

  • letter是一个std :: string,但是你为它分配了一个字符;这是允许的,但你确定这是意图吗?您可以使用char而不是string。
  • alldata [2]是一个char。对于线路&#34; A:2&#34;例如,该值将为&#39; 2&#39; (ascii值为50,与值2不同)。你不能简单地用int()将它转换为int。要将数字的字符(&#39; 0&#39; ..&#39; 9&#39;)转换为相应的整数值,您需要从ascii代码中减去值48(或&#39; 0& #39;)
  • 还将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();
}