2014-11-12 4 views
0

Мой код:ifstream() объекта Проблемы * полукокса

ifstream Reader ("commands.txt"); 
if(Reader.fail()) 
{ 

    error("File \"commands.txt\" could not be found or opened.\n"); 

} 

Reader.seekg(0, Reader.end); 
int FSize = Reader.tellg(); 

if(FSize == 0) 
{ 

    cout << "File \"commands.txt\" is empty.\n"; 
    return 0; 

} 

char * ContentsHold = {}; 
Reader.read(ContentsHold, FSize); 
Reader.close(); 

string Contents(ContentsHold); 

Идея заключается в том, что в конце, содержание должно быть C++ строка, которая держит все в commands.txt. Я получаю ошибку «basic_string :: _ S_construct null недействителен». Я не могу понять, что происходит не так. Помогите?

+1

'char *' объявляет указатель, а не массив. Если вы инициализируете его с помощью '{}', это не приведет к созданию пустого массива, но будет инициализировать значение-указатель, который приводит к 'nullptr'. Почему бы вам не использовать 'vector ' или 'string' вместо этого и прочитать его базовый буфер? –

ответ

0

То, что вы здесь,

char* ContentsHold = {}; 

объявляет указатель на символ инициализирован с нулевой константой. Это не указатель на первый элемент массива, вы должны использовать синтаксис new[] для этого:

char* ContentsHold = new char[FSize]; 

Это создаст массив и ContentsHold будет указывать на его первый элемент. Еще лучше было бы использовать std::string и выставить адрес его первого элемента:

std::string ContentsHold(FSize); 
Reader.read(&ContentsHold[0], FSize); 

Таким образом, вам не придется беспокоиться об удалении new'd памяти.