C ++如何读取从文件到char数组的一行文本

时间:2017-04-23 16:27:06

标签: c++

我在从文件到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数组是临时数组。我将文本传递给此数组,然后将其传递给类数据成员

3 个答案:

答案 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数组而不是字符串)你必须决定如果你想要如何初始化数组的其余部分避免胡言乱语。