从二进制文件中读取char*

4

我需要将一个文件的名称存储到我正在写入的二进制文件中,目前我已经这样写了:

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*作为其第一个参数。 任何帮助都将是伟大的。

问题在于 fname = header + fname + ".mcp"; 使得 pName 失效成为悬空指针,如果继续使用它会导致未定义的行为。 - molbdnilo
那正是@molbdnilo解决的问题,现在它运行得很好。感谢您的帮助:D - eragon2262
2个回答

3

好的,出现了意外情况,我终于解决了自己的问题。由于某种原因,在声明时出现了

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

在声明之前

const char * pName = fname.c_str();

在写入文件之前,该调用破坏了pName的值,这是导致错误的原因。问题已解决!


0

既然你正在使用ifstream,为什么不同时使用ofstream呢?这样只需要ofs << filename来存储,ifs >> filename来读取,其中filename是一个字符串。无需自己处理长度。


我使用fwrite而不是<<,因为我必须将我创建的单个位写入文件。这就是为什么我也有长度的原因。 - eragon2262

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接