为什么我的这些代码不能删除文件中指的信息?void DeleteBookInformation () //删除信息{ReadFromFile()in
为什么我的这些代码不能删除文件中指的信息?
void DeleteBookInformation () //删除信息
{
ReadFromFile();
int i=0;
char delname[17];
BookInformation s[MAX];
cout<<"请输入要删除的书名:";
cin>>delname;
fstream f;
f.open("f:\\lib.txt",ios::in);
while(!f.eof())
{
f.read((char *)&s[i],sizeof(s[i]));
if(strcmp(s[i].BookName,delname)==0)
i--;
i++;
}
f.close();
fstream f1("f:\\lib.txt",ios::trunc);
f1.close();
ofstream f2("f:\\lib.txt",ios::app);
for(int j=0;j<i-1;j++)
f2.write((char *)&s[j],sizeof(s[j]));
f2.close();
ReadFromFile();
}
为什么我的这些代码不能删除文件中指的信息?
求赐教
[解决办法]所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
[解决办法]这个问题不是很复杂;
1)输入要删除的书名;
2)读数据并比较删除的书名
读出文件里的书名一个一个比较,相同不写入新文件,不同写入新文件;
3)文件删除及改名。
关闭文件两个文件,删除旧文件,新文件改名为旧文件名字;
删除结束。
如果要在同一个文件里处理,要把后面的数据前移比较麻烦,而且要改变文件的长度,这也不是标准操作,记得以前,要向文件里写入EOF,好像就是整型数-1;现在Windows可以 SetEndOfFile
不过不是C,C++的标准库里的函数。
[解决办法]这个要求数据量比较小才行,数据量比较大,没处存放。
1)每轮循环结束关闭,然后下一轮再打开。
2)一直打开,直到循环结束。每次seekg到文件开头即可。