读二进制写入字符串c

时间:2018-05-24 22:07:25

标签: c string pointers binaryfiles

所以,我环顾了互联网,并在这里找了几个问题,我找不到任何可以解决我问题的方法。我有一个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); }

1 个答案:

答案 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);