如何从文本文件中读取特定数量的字符

9

我尝试以这种方式实现

 #include <iostream>
 #include <fstream>

using namespace std;

int main()
{
    char b[2];
    ifstream f("prad.txt");
    f>>b ;
    cout <<b;
    return 0;
}

它应该读取2个字符,但却读取整行。这在其他语言中可以使用,但在C++中出了一些问题。


感谢您提供一个简短完整的示例程序,+1。http://sscce.org - Robᵩ
4
这段话的意思是:“这在另一种语言上有效,但在C ++中由于某些原因不起作用。” 这是编程中可能做出的最糟糕的假设之一。两种语言是不同的,所以它们可能会有不同的行为。我会尽力使翻译更加通俗易懂,但不会改变原意。 - PlasmaHH
是的,这种想法非常危险。如果你是从Java转到C++(从你的错误看来是这样),你确实需要坐下来阅读一些关于指针和数组的内容,并确保在自己脚上开枪之前理解了发生了什么。 - zmccord
3个回答

11

您可以使用read()指定要读取的字符数:

char b[3] = "";
ifstream f("prad.txt");

f.read(b, sizeof(b) - 1); // Read one less that sizeof(b) to ensure null
cout << b;                // terminated for use with cout.

2
为了让32之间的关系更加明显,我建议使用一个命名常量。size_t const BufferSize = 2;char b[BufferSize+1] = "";f.read(b, BufferSize); - Matthieu M.
@MatthieuM.,我通常会使用sizeof(b) - 1(如果可能的话)。代码已更新。 - hmjd
我总是不愿意推荐这个,因为如果b是一个指针,编译仍然可以通过,但在64位平台上你会得到一个固定的7。不过,你可以使用一个用于数组的size函数,使用模板很容易实现。 - Matthieu M.
@MatthieuM。说得好。我看过使用模板的解决方案(在这个网站上很多次),但这里的目的是指出需要空终止的要求。 - hmjd

2

这段代码在其他语言中有效,但在C++中无法运行。

不同的编程语言之间有很多差异。特别是在这种情况下,你可能会遇到一个问题,即在C++中指针和数组几乎没有区别。该数组作为char指针传递给operator>>,被解释为字符串指针,因此它会像对待char缓冲区一样读取(直到达到宽度限制或行尾)。当发生这种情况时,你的程序应该崩溃,因为你溢出了缓冲区。


0
istream& get (char* s, streamsize n );

从流中提取字符,并将它们作为 C 字符串存储到以 s 开头的数组中。字符被提取,直到提取了 (n-1) 个字符或找到定界字符 '\n'。如果在输入序列中到达文件的结尾或在输入操作期间发生错误,则提取也会停止。如果找到定界字符,则不会从输入序列中提取该字符,并保留为下一个要提取的字符。如果您想要提取(并丢弃)此字符,请使用 getline。自动将用于表示 C 字符串结尾的末尾空字符附加到 s 存储的内容的末尾。

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