我在从文件到char数组中读取一行文本时遇到困难。假设我有一个名为" sample.txt"的文本文件,并且每行只包含几个单词。这是我的代码:
const bool HuffmanNode::operator<(const HuffmanNode &rhs){
return frequency < rhs.frequency;
}
空间后停止阅读。我也尝试过:
char buffer[100];
ifstream file;
file.open("sample.txt")
file >> buffer;
但这并没有给我正确的文字。在文本之后,一些随机符号被分配给数组的剩余部分。
任何帮助都将深表感谢!
编辑: 此char数组是临时数组。我将文本传递给此数组,然后将其传递给类数据成员
答案 0 :(得分:1)
对于每个和任何输入操作,必须检查返回值;否则你无法知道操作是否成功以及它做了什么。
如果您正在读取固定缓冲区,则需要检查流对象和提取字符的数量:
file.getline(buffer, sizeof buffer);
auto n = file.gcount();
if (file) {
std::cout << "Read line with " << n << " characters: '";
std::copy_n(buffer, n, std::ostream_iterator<char>(std::cout));
std::cout << "'\n";
} else if (n > 0) {
std::cout << "Read incomplete line with prefix '";
std::copy_n(buffer, n, std::ostream_iterator<char>(std::cout));
std::cout << "'.\n";
file.clear();
} else {
std::cout << "Did not read any lines.\n";
}
请注意,提取的计数(file.gcount()
)包括空终止符,basic_istream::getline
写入输出缓冲区。 (因此,可以完全读取的行的最大长度为sizeof(buffer) - 1
。)
或者,您可以读入动态字符串。这意味着将自动分配内存以保存每个完整的行,但是更容易推理:
for (std::string line; std::getline(file, line); ) {
std::cout << "Read one line: '" << line << "'\n";
}
这里我们只检查输入操作是否成功,我们在循环条件中执行此操作。成功阅读后,提取的字符数(此时不包括空终止符)正好为line.size()
。
答案 1 :(得分:0)
使用std::string
对象获取行内容并稍后将其转换为char数组会更容易:
std::string str;
std::getline(file,str);
const char* c = str.c_str();
答案 2 :(得分:0)
尝试在执行getline之前打印出数组。您会注意到zany符号填充整个数组。
getline()会将字符从输入流中放入数组,直到读取100个字符或达到分隔符。如果在100个字符之前达到分隔符,则长度为100的数组的其余部分将指向未初始化的内存。
如果你想以这种方式与流交互,(使用char数组而不是字符串)你必须决定如果你想要如何初始化数组的其余部分避免胡言乱语。