使用 <fstream> 从文件中流式读取数据

3

如何在读取文件时不丢失空格来读取字符?
我有一个文件,其中包含例如以下内容:
The quick brown fox jumps over the lazy dog.
当我从文件中读取(每次读取一个字符),我会丢失空格,但是所有其他字符都可以正确读取。为什么?
以下是示例代码:

unsigned int cap = (unsigned)strlen("The quick brown fox jumps over the lazy dog.");
char c[cap];
int i = 0;
while (!fIn.eof()) {
    fIn >> c[i];
    ++i;
}

for (int i = 0; i < cap; i++)
    cout << c[i];

当我打印这个数组时,所有的空格都不见了。你能告诉我如何避免这个问题吗?
3个回答

4
你可以使用在<iomanip>中声明的流操作符。其中一个你会用到的是std::noskipws,它能指示流提取操作符不要跳过空格。
#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>

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

    ifs >> std::noskipws;

    std::copy(std::istream_iterator<char>(ifs),
              std::istream_iterator<char>(),
              std::ostream_iterator<char>(std::cout));
}

另一种选择是使用原始输入函数 fstream::get(), fstream::read()

我猜这是因为 istream::operator>>() 被设计成一个控制台输入方法?(类似于程序参数通过空格进行分词)。与 istream 中其他更像文件读取器的读取/获取行函数相对。 - undefined

2
使用"get"方法:
ifstream in("try.in");
char c;
while((c = in.get()) && in) {
  cout << c;
}

get() 函数定义在哪个头文件中? - Overflowh
1
为此,您需要同时使用 fstream 和 iostream。 - Ivaylo Strandjev
“(c = in.get())” 这一段代码是如何将 c 赋值为下一个字符的?我理解在 while 循环中这个操作只是检查是否还有另一个字符而已。你能否解释一下这个过程呢? - Omar
这与问题无关。请尝试阅读在线提供的信息,如果仍有不清楚的地方,请单独发布一个问题。 - Ivaylo Strandjev
istream::get() 返回一个字符并递增到下一个字符;https://cplusplus.com/reference/istream/istream/get/istream::peek() 也返回一个字符,但不递增;也许你在想的是这个? - undefined
@diox8tony 但是我的意思是要增加字符。你为什么认为我不应该这样做呢? - undefined

1

默认情况下,istream具有skipws(跳过空格)标志设置。这将在读取时跳过前导空格。

您可以使用

fIn << std::noskipws;
while (!fIn.eof()) {
    // etc.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接