Есть ли в C ++ аналог для Python file.read (2)? - PullRequest
0 голосов
/ 14 октября 2011

Я сейчас пытаюсь сделать аналог функции 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 ]

1 голос
/ 14 октября 2011

Измените определение функции на это (обратите внимание на знак &):

string read_two_bytes(fstream & file)
1 голос
/ 14 октября 2011

@ vivek указал, что вы не можете передать fstream "по значению".Передача вещей по значению делает их копии (или, скорее, запускает их конструктор копирования, который на самом деле может или не может сделать их «глубокую» копию).

Как только вы исправите это, iostream s на самом делемилый и приятный.Они могут определить тип, который вы запрашиваете, и прочитать только этот объем данных.Если это символ и вы используете потоковые операторы, он прочитает значение байта:

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

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

  return two_bytes;
}

@ Ним, кажется, пытается дать вам обобщенный ответ, возможно, чтобы показать C ++ против Python.Это больше ответ на вопрос для «N-байтов», за исключением того, что он жестко закодирован 2, так что это выглядит как избыточное убийство.Это можно сделать проще, но приятно знать, что гибкость есть ... нет?

Если вы новичок в C ++ I / O, вы можете найти ответ на этот вопрос, который я потрудился написать на дняхбыть интересным в отличие от методов, предлагаемых другими ответами:

Ошибка вывода, когда ввод не является числом.C ++

1 голос
/ 14 октября 2011

используйте функцию read или readsome в istream. * например 1004 *

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

if (myfile.read(&buffer[0], 2))
  std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<int>(std::cout, ""));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...