我正在使用c ++并逐个字符地读取文件。我使用>>做到了运营商。但是当空间出现时它会显示错误,因为在这种情况下它不会接受输入。那么,如何在不使用getline的情况下获得空格字符。
答案 0 :(得分: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
}
答案 1 :(得分: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
答案 2 :(得分:0)
如果您想逐个阅读文件,请不要使用>>
。
ifstream File ("file.txt");
char Buffer[ARBITRARY_SIZE];
File.read(Buffer, ARBITRARY_SIZE);
然后,您可以解析缓冲区。它快得多。它也会比.get()
更快。您可以在Buffer上运行所有正常的字符串操作(例如,将其转换为stringstream)。然后,所有操作都将在内存中完成。
答案 3 :(得分:0)
istream.get(char&)
,istream.get()
:http://www.cplusplus.com/reference/iostream/istream/get/ 或
<iomanip>
标题的noskipws
:请参阅http://www.cplusplus.com/reference/iostream/manipulators/noskipws/上的示例