如何从文本文件中读取特定数量的字符
Posted
技术标签:
【中文标题】如何从文本文件中读取特定数量的字符【英文标题】:How to read a specific amount of characters from a text file 【发布时间】:2012-03-20 02:12:49 【问题描述】:我试着这样做
#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 和“谢谢”提供了一个简短而完整的示例程序。 sscce.org “这适用于另一种语言,但由于某种原因在 C++ 中不起作用。”这是您在编程中可以做出的最糟糕的假设之一。它们是两种不同的语言,因此它们可以有不同的行为。 是的,这样想是很危险的。如果您是从 Java 转向 C++(这就是您的错误的样子),您确实需要坐下来阅读指针和数组的一些内容,并确保在您自责之前了解正在发生的事情。 【参考方案1】:您可以使用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.
【讨论】:
为了使3
和2
之间的关系更加明显,我建议使用命名常量。 size_t const BufferSize = 2;
、char b[BufferSize+1] = "";
和 f.read(b, BufferSize);
@MatthieuM.,我通常会使用sizeof(b) - 1
(如果可能的话)。代码已更新。
我总是不愿意推荐这个,因为如果 b
是一个指针,编译仍然可以通过你在 64 位平台上得到一个固定的 7
。不过,您可以对数组使用 size
函数,使用模板很容易。
@MatthieuM。好点子。已经看到使用模板的解决方案(在这个网站上很多次),但这里的目的是表明空终止的要求。【参考方案2】:
这适用于另一种语言,但在某些情况下不适用于 C++ 原因。
有些事情会因语言而异。特别是,在这种情况下,您遇到了这样一个事实,即在 C++ 中指针和数组几乎没有什么不同。该数组作为指向 char 的指针传递给 operator>>,该指针被解释为字符串指针,因此它执行对 char 缓冲区所做的操作(即读取直到宽度限制或行尾,以先到者为准)。发生这种情况时,您的程序应该崩溃,因为您的缓冲区溢出。
【讨论】:
【参考方案3】:istream& get (char* s, streamsize n );
从流中提取字符并将它们作为 c 字符串存储到 从 s 开始的数组。字符被提取直到 (n - 1) 字符已被提取或分隔符 '\n' 是 成立。如果到达文件末尾,提取也会停止 输入序列或在输入操作过程中发生错误。如果 找到分隔符,它不是从输入中提取的 序列并保留为要提取的下一个字符。采用 getline 如果您希望提取(并丢弃)此字符。 表示 c 字符串结束的结束空字符是 自动附加在存储在 s 中的内容的末尾。
【讨论】:
以上是关于如何从文本文件中读取特定数量的字符的主要内容,如果未能解决你的问题,请参考以下文章