У меня есть код C ++, работающий в Windows 7, но не работает в Windows10. Работает в MAC / LINUX. Я пытаюсь разобрать большой шестнадцатеричный файл. Мой код загружается в массив, а затем применяет бизнес-логику для генерации CSV. Размер файла составляет 2,38 ГБ. Ниже приведен код.

bool readFile (string filename, char ** buffer  ,unsigned  int & sizeOfFile )
{
  ifstream inFile (filename.c_str (), ios::in | ios::binary);

  if (!inFile)
    return false;

  inFile.seekg (0, ios::end);
  size_t size = inFile.tellg ();
  inFile.seekg (0, ios::beg);

  *buffer = new char[size];

  cout<<"\n Length of the ARRAY= "<<size;

  inFile.read (*buffer, size);
  inFile.close ();
  sizeOfFile =  size;
  cout<<"File successfully read Press Any Key to Continue.. "<<endl;
  //getch();
  return true;
}

Не удается загрузить файл в массив, когда я запускаю его в Windows 10 в Visual Studio 2015, а также в Dev C ++. Он отлично работает в Windows 7.

-2
Deepanjan Paul 4 Апр 2017 в 17:54

2 ответа

Лучший ответ
size_t size = inFile.tellg ();
...
*buffer = new char[size];

Похоже, вы не создаете достаточно большого пространства для чтения всего файла. Если бы размер файла составлял 10 байт, вам нужно было бы выделить 11 байт, поскольку в конце строки, заканчивающейся нулем, требуется дополнительный символ в конце сохранить символ '\0', чтобы завершить его. Тот факт, что он работает в некоторых системах, но не в других, является чистой удачей, так как это означает, что в этих системах в нужной точке памяти был символ NUL для правильного завершения строки.

-2
Chris Turner 4 Апр 2017 в 14:57

Не будет ли проще использовать сопоставление файлов?

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx

РЕДАКТИРОВАТЬ: Вы упоминаете ниже, что вы используете один и тот же код на MacOS и Linux. Я более знаком с этими платформами, где я бы использовал mmap (). Эффективно это автоматизирует загрузку данных из файла в память.

В противном случае, как упоминалось выше, вам необходимо предоставить больше информации о природе проблемы (32- или 64-битная сборка, тип сбоя).

-1
Paul Floyd 8 Апр 2017 в 07:26