1

我正在使用 c++ 并逐个字符地读取文件。我使用 >> 运算符做到了这一点。但是当空间出现时,它会显示错误,因为在这种情况下它不会接受该输入。那么,如何在不使用 getline 的情况下获得空格字符。

4

4 回答 4

3

您可以使用std::istreambuf_iterator

#include <fstream>
#include <iterator>
#include <iostream>

int main()
{
    std::ifstream file("file.txt");

    std::istreambuf_iterator<char> it(file), end;

    for (; it != end; ++it) {
        std::cout << *it;
    }
}

如果您以二进制模式打开文件,在缓冲区中一次完整地读取它,然后处理它,您将获得更好的性能:

 #include <vector>
 #include <fstream>

 int main()
 {
      std::ifstream file("file.txt", std::ios::binary);
      file.seekg(0, std::ios::end);  // seek to the end
      std::streamsize size = file.tellg();  // get the position (file size)
      file.seekg(0, std::ios::beg);  // seek back to the beginning

      std::vector<char> buffer(size);
      file.read(&buffer[0], size);

      // do the work on vector
 }
于 2012-08-16T09:27:16.513 回答
3

你试过使用istream& get ( char& c );吗?一次读取一个字符。以下示例显示了如何:

char c;
while ( cin.get(c) )
{
    cout << "> " << c << endl;
}

运行它给出:

echo "hello world" | ./sing_in 
> h
> e
> l
> l
> o
>  
> w
> o
> r
> l
> d
> 

如果没有关于你在做什么的进一步线索,我真的不能说它是否会对你有帮助,我不理解你对使用的缄默getline

于 2012-08-16T09:27:41.347 回答
0

如果要按字符读取文件,请不要使用>>.

ifstream File ("file.txt");
char Buffer[ARBITRARY_SIZE];
File.read(Buffer, ARBITRARY_SIZE);

然后,您可以只解析缓冲区。它要快得多。它也会比.get(). 您可以在 Buffer 上运行所有正常的字符串操作(例如,将其转换为字符串流)。然后,所有操作都将在内存中完成。

于 2012-08-16T09:27:03.950 回答
0

或者

于 2012-08-16T09:30:17.223 回答