将二进制文件读写为字符串c
所以,我环顾了一下互联网和这里的几个问题,我在这里找不到任何可以解决我问题的方法。我有一个C编程的任务,写一个程序,允许用户在字符串中输入单词,添加更多单词,将字符串中的所有单词放入文本文件,删除字符串中的所有单词,当它们退出时,它将单词保存为二进制,在再次启动程序时加载。我已经把一切都准备好了,除了二进制文件 我做了两个函数,一个在程序启动时加载bin文件,另一个在程序结束时保存bin文件。我不知道问题是从哪个方面开始的,或者两者都是。但基本上我知道它不能正常工作,因为当程序将bin文件加载到字符串中后,如果我将其保存到文本文件中,我的文本文件中就会出现垃圾。我确信文本文件保护程序工作正常 感谢所有花时间帮助我的人,这是一整天的过程!哈哈 这里是我函数的两个片段,我代码中的所有其他部分都正常工作,所以我不想用整个程序来掩盖这篇文章,但如果需要的话,我会把它放上去解决这个问题 大小是10000的常量,以满足1000字的程序规格。但我不能让它运行,即使只要求10个元素或1个元素,只是为了澄清这一点将二进制文件读写为字符串c,c,string,pointers,binaryfiles,C,String,Pointers,Binaryfiles,所以,我环顾了一下互联网和这里的几个问题,我在这里找不到任何可以解决我问题的方法。我有一个C编程的任务,写一个程序,允许用户在字符串中输入单词,添加更多单词,将字符串中的所有单词放入文本文件,删除字符串中的所有单词,当它们退出时,它将单词保存为二进制,在再次启动程序时加载。我已经把一切都准备好了,除了二进制文件 我做了两个函数,一个在程序启动时加载bin文件,另一个在程序结束时保存bin文件。我不知道问题是从哪个方面开始的,或者两者都是。但基本上我知道它不能正常工作,因为当程序将bin文件加载到
void loadBin(FILE *myBin, char *stringAll) {
myBin = fopen("myBin.bin", "rb");
if (myBin == NULL) {
saveBin(&myBin, stringAll);
}//if no bin file exists yet
fread(stringAll, sizeof(char), SIZE + 1, myBin);
fclose(myBin); }
/
您在myBin文件*中留下了错误的值,并传递了指针的&(地址) 传递文件名,您可以(重新)将函数用于其他目的、其他文件等
char* filename = "myBin.bin";
传递要读取的文件名、缓冲区指针和最大大小。您应该考虑使用STAT/FSTAT来发现文件大小
size_t loadBin(char *fn, char *stringAll, size_t size)
{
//since you never use myBin, keep this FILE* local
FILE* myBin=NULL;
if( NULL == (myBin = fopen(fn, "rb")) ) {
//create missing file
saveBin(fn, stringAll, 0);
}//if no bin file exists yet
size_t howmany = fread(stringAll, sizeof(char), size, myBin);
if( howmany < size ) printf("read fewer\n");
if(myBin) fclose(myBin);
return howmany;
}
fwrite(&stringAll
应该是fwrite(stringAll
?saveBin(myBin,stringAll)
,而不是&myBin
,这将是一个**文件
对我的代码建议的两个小调整和我后来修复的几个语法错误使它工作了,肯定不是最漂亮的代码,但现在是夏季课程时间,可以继续使用XD了。编辑:我不是有意发布这个,我想说谢谢你对我代码的深入发布。我试过了为了使用它,我在那里查找缓冲区是什么/做什么、fstat和其他我不懂的代码,但我完全迷路了。如果你有一个好的参考资料让我更好地理解其中的一些内容,我很乐意研究它,我只是很感激能接触到更多我肯定会看到的概念!
size_t loadBin(char *fn, char *stringAll, size_t size)
{
//since you never use myBin, keep this FILE* local
FILE* myBin=NULL;
if( NULL == (myBin = fopen(fn, "rb")) ) {
//create missing file
saveBin(fn, stringAll, 0);
}//if no bin file exists yet
size_t howmany = fread(stringAll, sizeof(char), size, myBin);
if( howmany < size ) printf("read fewer\n");
if(myBin) fclose(myBin);
return howmany;
}
size_t saveBin(char *fn, char *stringAll, size_t size)
{
int stringLength = 0;
//again, why carry around FILE* pointer only used locally?
FILE* myBin=NULL;
if( NULL == (myBin = fopen("myBin.bin", "wb")) ) {
printf("Problem writing file!\n");
exit(-1);
}
//binary data may have embedded '\0' bytes, cannot use strlen,
//stringLength = strlen(stringAll);
size_t howmany = fwrite(stringAll, sizeof(char), size, myBin);
if( howmany < size ) printf("short write\n");
if(myBin) fclose(myBin);
return howmany;
}
size_t buffer_size = SIZE;
char buffer[SIZE]; //fill this with interesting bytes
saveBin(filename, buffer, buffer_size);
size_t readcount = loadBin(filename, buffer, buffer_size);