2014-10-15 3 views
2

я должен хранить имя файла в двоичный файл, который я пишу, я в настоящее время написал так:Чтение обугленного * из двоичного файла

void write(map<char, bits> &bitstring,map<char,int> &ccount, string header,string fname,ofstream  &outf) 
{ 
ifstream inf(header+fname); 
cout << "FName: " << fname << endl; 
const char * pName = fname.c_str(); 
fname = header+ fname + ".mcp"; 
const char * c = fname.c_str(); 
FILE* pFile; 
pFile = fopen(c, "w+b"); 
inf.seekg(ios::beg, ios::end); 
int size = inf.tellg(); 
int length = 0; 
string data = ""; 
int magicNum = 2262; 
int fileNameSize = strlen(pName); 
fwrite(&fileNameSize, sizeof(int), 1, pFile); 
cout <<"FIle Name Size: "<< fileNameSize << endl; 
fwrite(pName, fileNameSize, 1, pFile); 
fclose(pFile); 

}

И Я также отправляю размер имени файла, чтобы я знал, сколько данных мне нужно прочитать, чтобы получить полное имя файла.

void read2(string fname, map<char, int> &charCounts, std::vector<bool> &bits,ofstream &outf) 
{ 
string fname1 = fname + ".mcp", outfile = "binarycheck"; 

bool testDone = false, counts = false; 
std::ifstream inf(fname1, std::ios::binary); 
std::ofstream ouf("binarycheck.txt", std::ios::binary); 
char character; 

int count[1] = { 0 }; 
int checkcount = 0; 
int mNum[1] = { 0 }, size[1] = { 0 }; 


int FNamesize = 0; 
inf.read((char*)&FNamesize, sizeof(int)); 
char *name=new char[FNamesize+1]; 
inf.read(name, FNamesize); 
name[FNamesize] = '\0'; 
string str(name); 
cout << "File Name: "; 
cout << std::string(name) << endl; 
cout << "Magic Num: " << mNum[0] << endl; 
cout << "File Name Size: " << FNamesize<< endl; 


inf.close(); 
} 

Я получаю размер правильно, но я понятия не имею, как перебирать имя, чтобы сохранить его как строку. Я попытался использовать вектор, но это не помогло, так как inf.read использует char * в качестве своего первого параметра. Любая помощь будет замечательной.

+0

Проблема заключается в том, что 'fname = header + fname +" .mcp ";' invalidates 'pName', который становится обвисшим указателем, и любое его использование вызывает неопределенное поведение. – molbdnilo

+0

Это была проблема @molbdnilo, и теперь она отлично работает. Спасибо за помощь: D – eragon2262

ответ

1

Ну, в результате несчастного случая я решил решить свою проблему. По какой-то причине, когда я объявил

FILE* pFile; 
pFile = fopen(c, "w+b"); 

До объявления

const char * pName = fname.c_str(); 

Вызов испорчены значение PNAME до того, как было написано в файл, который является причиной того, что ошибки. Задача решена!

0

Видя, как вы используете ifstream, почему бы и не использовать поток? Тогда это будет ofs << filename для хранения и ifs >> filename, чтобы прочитать, где filename - это строка. Не нужно напрягаться с длиной самостоятельно.

+0

Я использую fwrite вместо <<, потому что мне пришлось писать отдельные биты, которые я создал в файле. Вот почему у меня тоже есть длина. – eragon2262

Смежные вопросы