我有一个看起来像这样的文件:
2,1,4,6,7
1,2,3,6,5
我必须在忽略逗号的情况下在一行中计数数字。例如,第一行有5位数字,第二行也有5位数字。每行中的位数可能会有所不同。我使用getline
和逗号分隔符。但是,如果这样做,我不知道行何时结束。我编写的代码将为我计算整个文件的数量。我想要的是一种在一行中计算数字的方法。我该怎么办?
numberofdigits = 0;
while(!friendsFile.eof())
{
getline(friendsFile,counts,',');
intcounts = stoi(counts);
cout << intcounts;
numberofdigits++;
}
答案 0 :(得分:0)
逐行阅读并在std::stringstream
的帮助下组合您的解决方案:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
int main() {
std::ifstream input{"input.txt"};
if(!input) {
std::cerr << "Failed to open the file\n";
return 1;
}
std::size_t line_number = 0;
std::istringstream stream{};
for(std::string line{}; std::getline(input, line); stream.clear()) {
stream.str(line);
std::size_t count = 0;
std::string number{};
while(std::getline(stream, number, ',')) {
++count;
}
std::cout << "Line " << line_number++ << " contains " << count << " digits\n";
}
}
确保成功打开文件后,就可以开始处理文件了。
首先,请注意for()
循环。我们使用line
字符串来保存从文件中读取的行。循环的条件也是 我们读取该行的部分。 std::getline
不仅读取一行,还从读取的地方返回该流。可以将该流隐式转换为bool
,以检查该流是否处于有效状态。这样,我们将逐行读取 文件,并确保如果出现问题(即到达文件末尾),我们将不会进入循环并使用它,因为它可能已损坏,数据。使用此方法与almost always wrong和!file.eof()
之间存在很大的差异。
然后,在读取一行之后,我们用它初始化一个std::istringstream
对象。字符串流是有用的帮助程序,它使我们能够像对待流一样操作文本。我们再次使用std::getline
,但是这次提取所有用','
分隔的标记。
在处理一行之后,stream.clear()
部分必不可少,因为它清除了流的所有不良状态(即,到达文件末尾的状态-在我们的情况下,是在读取整行之后)。
我们计算成功提取的次数并将其显示在屏幕上。