我目前正在开发一个C ++的小项目,目前有点困惑。我需要在()中使用ifstream从文件中读取一行中的一定数量的单词。它现在的问题在于它不断忽略空间。我需要计算文件中的空格量来计算单词的数量。反正有没有()不忽略空格?
ifstream in("input.txt");
ofstream out("output.txt");
while(in.is_open() && in.good() && out.is_open())
{
in >> temp;
cout << tokencount(temp) << endl;
}
答案 0 :(得分:3)
计算文件中的空格数:
std::ifstream inFile("input.txt");
std::istreambuf_iterator<char> it (inFile), end;
int numSpaces = std::count(it, end, ' ');
计算文件中的空白字符数:
std::ifstream inFile("input.txt");
std::istreambuf_iterator<char> it (inFile), end;
int numWS = std::count_if(it, end, (int(*)(int))std::isspace);
作为替代方案,您可以计算单词,而不是计算空格。
std::ifstream inFile("foo.txt);
std::istream_iterator<std::string> it(inFile), end;
int numWords = std::distance(it, end);
答案 1 :(得分:2)
我是这样做的:
std::ifstream fs("input.txt");
std::string line;
while (std::getline(fs, line)) {
int numSpaces = std::count(line.begin(), line.end(), ' ');
}
一般来说,如果我必须为文件的每一行做一些事情,我发现std :: getline是最不好用的方法。如果我需要来自那里的流操作符,我将最终从该行中创建一个字符串流。它远非最有效的做事方式,但我通常更关心的是做正确的事情并继续为这类事情继续生活。
答案 2 :(得分:1)
您可以将count
与istreambuf_iterator
:
ifstream fs("input.txt");
int num_spaces = count(istreambuf_iterator<unsigned char>(fs),
istreambuf_iterator<unsigned char>(),
' ');
修改强>
最初我的回答使用了istream_iterator
,但是@Robᵩ
指出它不起作用。
istream_iterator
将遍历流,但假设空格格式并跳过它。上面我的示例但使用istream_iterator
返回结果为零,因为迭代器跳过了空格,然后我让它计算剩下的空格。
istreambuf_iterator
但是一次只占一个原始字符,不会跳过。
有关详细信息,请参阅istreambuf_iterator
vs istream_iterator
。