读取整行,包括来自fstream的空格

时间:2013-01-24 21:45:29

标签: c++ fstream

我目前正在开发一个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;
}

3 个答案:

答案 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)

您可以将countistreambuf_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