虽然(fin>> a)或while(fin.eof())在第一种情况下不起作用,但fin流变量仍将文件中的最后一个char作为输入

时间:2016-09-02 16:55:17

标签: c++ visual-studio-2013 ifstream

while(fin >> a)

while(fin.eof())

没有工作。在第一种情况下,fin流变量不断将文件中的最后一个char作为输入。

我的输入文件如下所示:

ab5c71,lj4j6v7;
sd9vg0,kj9ref9,fjuwe;

这是我的代码:

[![int main()
    {
        int count = 0, col = 0, row = 0;
        ifstream fin;
        fin.open("Text.txt");
        char a;
        //count number of rows and cols
        while (fin >> a)
        {
            while (a != ',')//marks end of one word in a sentence
            {
                if (a >= '0'&&a <= '9')//sees if the input is a number
                {
                    count++;
                }
                if (a == ';')
                {
                    if (count > 0)
                    {
                        col++;
                    }
                    if (col > 0)
                    {
                        row++;
                        count = 0;
                        col = 0;
                    }
                }
                fin >> a;
            }
            if (count > 0)
            {
                col++;
            }
            count = 0;
        }
        cout << row << " " << col;
    return 0;
    }][1]][1]

它不是完整的代码。代码的实际所需输出是读取文件并输出包含所有数字的矩阵,假设一个单词中的数字(即逗号之前)为一个完整的数字并组成一个col,每一行以一个标记行结尾的半冒号结束。一个单词可能不包含任何数字是可能的,在这种情况下,矩阵中没有输入,并且整个行/句子也可能由这样的单词构成,在这种情况下不添加行。到目前为止我编写的代码只计算需要多少行和列。假设所有行都包含相等的列。

附加的样本文件的所需输出将是矩阵= [57,467; 90,99](昏迷和半冒号不应该是矩阵的一部分,只是添加它们来标记一个元素(昏迷)和行(半冒号)的结尾)

1 个答案:

答案 0 :(得分:4)

这里(几乎可以肯定)问题不在于你的while (fin>>a),它与循环中的fin >> a;一起,它没有测试结果,所以如果它在结束时被调用文件,你无限期地在循环中继续。

iostreams并不是特别有助于你在这里做的事情。特别是,如果我们可以要求流读取下一个逗号或分号(以先到者为准)并告诉我们哪一个结束了特定的读取,那么它将真的 nice 。这将让我们抓住下一个“领域”,查看其内容,并做出相应的反应。

缺乏这一点,我们有一些替代方案可供选择。一种是阅读一个完整的“记录”(一切都是分号),将其拆分成字段,并查看每一个:

std::string record;

while (std::getline(fin, record)) {
    std::istringstream buffer(record);
    std::string field;
    while (std::getline(buffer, field))
         if (std::any_of(field.begin(), field.end(), 
             [](unsigned char ch) { return isdigit(ch); })
         {
             ++col;
         }
    // when we get here, we've looked at all the fields of the current record.   
}