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](昏迷和半冒号不应该是矩阵的一部分,只是添加它们来标记一个元素(昏迷)和行(半冒号)的结尾)
答案 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.
}