【问题标题】:Store strings in binary file without them being overwritten将字符串存储在二进制文件中而不被覆盖
【发布时间】:2019-11-25 13:46:55
【问题描述】:

首先,这是我的代码的相关部分,然后我将继续解释。

scanf("%d", &option);
    fflush (stdin);

    //Insert
    if(option==1){

        printf("enter name\n");
        fgets(name,MAX_SIZE,stdin);
        printf("name: %s",name);

        char str[]="alpha one";
        fd=open(argv[1],O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
        write(fd,str,strlen(str) + 1);

        pcounter = updateCounter(pcounter, str);

        lseek(fd, 0, SEEK_END);

        char passpos[5];
        sprintf(passpos,"%d",pcounter); //int to string
        fd=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
        write(fd,passpos,3);
    }

我将 str 重新定义为“alpha one”的原因是,即使我试图在 scanf 后使用 fflush 清除缓冲区,fgets 仍然会得到一个“/n”作为输入(我假设)并且当我打印“名字”我一头雾水。即使这不是主要问题,任何有关这方面的帮助都会很有价值。

这都是一个循环,所以我想如果我在提示时继续按“1”,我的二进制文件应该如下所示: alpha onealpha one alpha one ...

但是,它看起来像:alpha 1,无论我按多少次 1。

与存储计数器的其他二进制文件相同,它会正确更新,因此在第一个循环之后它存储了“9”,但在第二个循环之后只有“18”,当我期望:9 18

我尝试完全删除 lseek,并将其设置为 CURR 而不是 END。结果相同。 我打开了最大警告,但编译时却没有。

我应该指出这是家庭作业,所以我不能使用 fopen 等,只能使用系统命令。

这里是 updateCounter 函数,以防有人想运行它:

int updateCounter(int pcounter, char *str){
int m,charcount = 0;
for(m=0; str[m]; m++) {
        charcount ++;
}
printf("chars: %d \n", charcount);

pcounter = pcounter + charcount;
printf("pcounter = %d \n", pcounter);

return pcounter;
}

感谢您的帮助。

【问题讨论】:

  • 与您的问题无关,但请不要将仅输入流(例如 stdin)传递给 fflush 在 C 中明确提及为 未定义行为规格。一些编译器允许它作为不可移植的扩展,但请不要使用它。
  • 顺便说一句,使用write(fd,str,11),您可以从仅包含10 字符(包括空终止符)的字符串中写入11 字符。超出数组范围是总是未定义的行为。使用sizeof str 获取数组的实际大小,或使用strlen(str) + 1。或者可以选择将数组定义为始终为11 字符大。
  • @Someprogrammerdude 11 个字符是剩余的,因为我曾经为 str 设置了不同的值,感谢您指出。至于 fflush,我应该改用什么?
  • 如果您停止使用magic numbers,如果您更改内容,尺寸将不会出现此类问题。而不是 fflush(stdin) 在循环中逐个字符地读取,直到您读取换行符为止。

标签: c file binaryfiles lseek


【解决方案1】:

您正在打开带有O_TRUNC 标志的文件。这告诉计算机从文件中删除所有数据。如果您不想删除文件中的所有数据,请不要使用 O_TRUNC。

另外,请确保在写入任何数据之前查找文件末尾。否则,您将覆盖文件开头的数据。您可以使用lseek 寻尾,也可以在打开文件时使用O_APPEND 标志自动寻尾。

【讨论】:

  • O_APPEND 在大多数情况下是首选,因为当两个或多个进程同时写入文件时,使用lseek() 容易出现竞争条件。
猜你喜欢
  • 2021-06-12
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多