将字符串存储在二进制文件中,而不会被覆盖

问题描述 投票:1回答:1

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

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 1”是因为,即使我试图在使用fflush的scanf之后清除缓冲区,fgets仍会获得“ / n”作为输入(我假设),并且在我打印“ name”时“我一片空白。即使不是主要问题,对此的任何帮助也将是有价值的。

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

但是,它看起来像:Alpha,无论我按多少次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;
}

感谢您的帮助。

c file binaryfiles lseek
1个回答
3
投票

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

此外,在写入任何数据之前,请确保先查找文件的末尾。否则,您将改写文件开头的数据。您可以使用lseek进行结尾搜索,也可以在打开文件时使用O_APPEND标志自动进行结尾搜索。

© www.soinside.com 2019 - 2024. All rights reserved.