首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么小弟我的这些代码不能删除文件中指的信息

2013-07-04 
为什么我的这些代码不能删除文件中指的信息?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++的标准库里的函数。




[解决办法]
引用:
我把fstream f1("f:\\lib.txt",ios::trunc);改成fstream f1("f:\\lib.txt",ios::out);后就实现了该功能。

这个要求数据量比较小才行,数据量比较大,没处存放。


引用:
那要是我想加循环呢,就是输入错误,显示cout<<"查无此人!";后再重新输入,但文件的内容不能变。求大神
 
1)每轮循环结束关闭,然后下一轮再打开。
2)一直打开,直到循环结束。每次seekg到文件开头即可。 

热点排行