所以,我环顾了互联网,并在这里找了几个问题,我找不到任何可以解决我问题的方法。我有一个C编程的任务,编写一个程序,允许用户在一个字符串中输入单词,添加更多单词,将字符串中的所有单词放入文本文件,删除字符串中的所有单词,当它们退出时保存二进制中的单词,在再次启动程序时加载。除了涉及二进制文件之外,我已经完成了所有工作。
我创建了两个函数,一个在程序启动时加载bin文件,一个在bin文件结束时保存bin文件。我不知道问题是从哪个开始,或者两个问题是否开始。但基本上我知道它没有正常工作,因为如果我在程序将bin文件加载到字符串后将其保存在文本文件中,我的文本文件中会出现垃圾。我确信文本文件保护程序正常工作。
感谢任何花时间帮助我的人,这是一个全天候的过程!洛尔
以下是我的函数的两个片段,我的代码中的其他所有内容似乎都有效,所以我不想在整个程序中删除这篇文章,但如果需要,我会把它解决这个问题。
SIZE是10000的常量,可以满足1000字的节目规格。但是我甚至不能让它只运行10个元素或1个,只是为了清除它
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); }
/
void saveBin(FILE *myBin, char *stringAll) {
int stringLength = 0;
myBin = fopen("myBin.bin", "wb");
if (myBin == NULL) {
printf("Problem writing file!\n");
exit(-1);
stringLength = strlen(stringAll);
fwrite(&stringAll, sizeof(char), (stringLength + 1), myBin);
fclose(myBin); }
答案 0 :(得分:0)
你在myBin FILE *中留下了不好的价值,并通过& (地址)指针。
传递文件名,您可以(重新)将这些功能用于其他目的,其他文件等等。
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;
}
传递文件名,缓冲区指针和大小以保存
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;
}
打电话给这些;你不能保证写作&amp;阅读相同的尺寸...
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);