将字符串存储在二进制文件中而不被覆盖
Store strings in binary file without them being overwritten
所以首先,这是我的代码的相关部分,然后我将继续解释。
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" 的原因是,即使我试图在使用 fflush 进行 scanf 之后清除缓冲区,fgets 仍然会得到一个“/n”作为输入(我假设)以及何时我打印 "name" 我得到空白。即使这不是主要问题,任何对此的帮助都是有价值的。
这是一个循环,所以我想如果我在提示时继续按“1”,我的二进制文件应该如下所示:alpha onealpha one alpha one ...
但是,它看起来像:alpha one,无论我按多少次 1。
与我存储计数器的其他二进制文件相同,它得到正确更新,因此在第一个循环之后它存储了“9”,但在我期望的第二个循环之后只有“18”:9 18
我尝试完全删除 lseek,并将其设置为 CURR 而不是 END。相同的结果。
我打开了最大警告,编译时得到 none。
我应该指出这是家庭作业,所以我不能使用 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;
}
感谢您的帮助。
您正在打开带有 O_TRUNC
标志的文件。这告诉计算机从文件中删除所有数据。如果您不想删除文件中的所有数据,请不要使用 O_TRUNC.
此外,请确保在写入任何数据之前查找到文件末尾。否则,您将覆盖文件开头的数据。您可以使用 lseek
搜索到结尾,或者您也可以在打开文件时使用 O_APPEND
标志自动搜索到结尾。
所以首先,这是我的代码的相关部分,然后我将继续解释。
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" 的原因是,即使我试图在使用 fflush 进行 scanf 之后清除缓冲区,fgets 仍然会得到一个“/n”作为输入(我假设)以及何时我打印 "name" 我得到空白。即使这不是主要问题,任何对此的帮助都是有价值的。
这是一个循环,所以我想如果我在提示时继续按“1”,我的二进制文件应该如下所示:alpha onealpha one alpha one ...
但是,它看起来像:alpha one,无论我按多少次 1。
与我存储计数器的其他二进制文件相同,它得到正确更新,因此在第一个循环之后它存储了“9”,但在我期望的第二个循环之后只有“18”:9 18
我尝试完全删除 lseek,并将其设置为 CURR 而不是 END。相同的结果。 我打开了最大警告,编译时得到 none。
我应该指出这是家庭作业,所以我不能使用 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;
}
感谢您的帮助。
您正在打开带有 O_TRUNC
标志的文件。这告诉计算机从文件中删除所有数据。如果您不想删除文件中的所有数据,请不要使用 O_TRUNC.
此外,请确保在写入任何数据之前查找到文件末尾。否则,您将覆盖文件开头的数据。您可以使用 lseek
搜索到结尾,或者您也可以在打开文件时使用 O_APPEND
标志自动搜索到结尾。