【问题标题】:read write binary into a string c将二进制文件读入字符串 c
【发布时间】:2018-05-24 22:07:25
【问题描述】:

因此,我浏览了互联网并在这里提出了几个问题,但找不到任何可以解决我的问题的方法。我有一个 C 编程任务,编写一个程序,允许用户在字符串中输入单词,添加更多单词,将字符串中的所有单词放入文本文件,删除字符串中的所有单词,当它们退出时保存二进制文件中的单词,在再次启动程序时加载。除了二进制文件之外,我已经完成了所有工作。

我做了两个函数,一个在程序启动时加载bin文件,一个在程序结束时保存bin文件。我不知道问题是从哪一个开始的,或者两者都开始。但基本上我知道它不能正常工作,因为如果我在程序将 bin 文件加载到字符串后将其保存在文本文件中,我的文本文件中就会出现垃圾。我确定文本文件保护程序工作正常。

感谢任何花时间帮助我的人,这是一个整天的过程!哈哈

这是我的函数的两个 sn-ps,我的代码中的其他所有内容似乎都可以正常工作,所以我不想用整个程序来涂抹这篇文章,但如果需要,我会提出来解决这个。

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); }

【问题讨论】:

  • fwrite(&stringAll 应该是fwrite(stringAll
  • saveBin(myBin, stringAll),而不是 &myBin,这将是 **FILE

标签: c string pointers binaryfiles


【解决方案1】:

您在 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;
}

调用这些;不保证您可以写和读相同的大小...

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

【讨论】:

  • 对我的代码提出的两个小调整和我之后修复的几个语法错误让它工作了,绝对不是最漂亮的代码,但现在是暑期课程的时候了 XD。编辑:并不是要发布那个,想说谢谢你在我的代码上的深入帖子。我尝试使用它,正在查找缓冲区是/做什么和 fstat 以及我在那里不理解的其他代码,但我完全迷失了。如果您有一个很好的参考资料让我更好地理解其中的一些内容,我很乐意研究它,我很高兴能够接触到更多我肯定会看到的概念!
猜你喜欢
  • 2023-03-18
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多