C ++中是否有用于Python的file.read(2)的模拟?

时间:2011-10-14 07:43:27

标签: c++ python file file-io

我目前正试图模仿Python的功能:

def read_two_symbols(fdescr):
 return(file.read(2))

myfile = open('mytext.txt', 'rb')
two_symbols = read_two_symbols(myfile)
print(two_symbols)

有没有办法在C ++中做到这一点?这就是我尝试过的:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

string read_two_bytes(fstream file)
{
  string byte1, byte2;
  byte1 = file.get();
  byte2 = file.get();
  string two_bytes = byte1 + byte2;
  return two_bytes;
}

int main()
{
  fstream myfile("mytext.txt", ios_base::in | ios_base::binary);
  string two_bytes = read_two_bytes(myfile);
  cout << two_bytes << endl;
  return 0;
}

然而它失败了。 :-(我怎么能用C ++做到?

3 个答案:

答案 0 :(得分:1)

使用read中的readsomeistream功能。 e.g

std::vector<char> buffer(2, 0);

if (myfile.read(&buffer[0], 2))
  std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<int>(std::cout, ""));

答案 1 :(得分:1)

将功能定义更改为此(注意&符号):

string read_two_bytes(fstream & file)

答案 2 :(得分:1)

@vivek指出你无法通过值传递fstream“。按值传递事物会使它们复制(或者更确切地说,运行它们的复制构造函数,这些构造函数可能会或可能不会实际制作它们的“深层”副本)。

一旦你解决了这个问题,iostream实际上是可爱和可爱的。他们可以检测您要求的类型并只读取该数据量。如果它是一个char并且您使用流操作符,它将读取一个字节值:

string read_two_bytes(fstream& file)
{
  char byte1, byte2;
  file >> byte1 >> byte2;

  string two_bytes;
  two_bytes += byte1;
  two_bytes += byte2;

  return two_bytes;
}
@Nim似乎试图给你一个通用的答案,也许是为了展示C ++与Python。它更多地回答了“N字节”的问题,除了他硬编码2所以它看起来有点矫枉过正。它可以做得更容易,但很高兴知道灵活性在那里......不是吗?

如果您是C ++ I / O的新手,您可能会找到这个问题的答案,我打算在前几天写一篇有趣的内容,与其他答案所建议的方法形成鲜明对比:

Output error when input isn't a number. C++