3

我正在尝试编写一个使用 fstream 读取文件的程序,然后重写一些文本并删除文件的其余部分这是我想要做的代码

#include<iostream>
#include<fstream>

using namespace std;
int main(int argc, char **argv){
    fstream *binf;
    fstream someFile("t.txt", ios::binary|ios::out|ios::in);
    int i;
    for(i=0;i<3;i++){
        char c;
        someFile.seekg(i);
        someFile.get(c);
        cout<<"c:"<<c<<endl;
    }
    someFile.seekp(i++);
    someFile.put("Y");
    someFile.seekp(i++);
    someFile.put("Y");
    //Delete the rest of the file
    return 0;
}

请注意以下用于打开文件的标志

ios::in Open for input operations.
ios::out    Open for output operations.
ios::binary Open in binary mode.
ios::ate    Set the initial position at the end of the file. If this flag is not set to any value, the initial position is the beginning of the file.
ios::app    All output operations are performed at the end of the file, appending the content to the current content of the file. This flag can only be used in streams open for output-only operations.
ios::trunc  If the file opened for output operations already existed before, its previous content is deleted and replaced by the new one.

我尝试了这些的许多组合,但没有一个可以帮助我做我想做的事情,我想阅读文件,直到找到文本。如果我找到我想要的文本,我会覆盖它并删除文件的其余部分。因此,应将文件重新调整为较小的文件。

4

1 回答 1

2

你不能用单个流对象来做到这一点。

可能的解决方案:

关闭您的文件并调用 truncate 函数:

 #include <unistd.h>
 int ftruncate(int fildes, off_t length);
 int truncate(const char *path, off_t length); 

MS Windows 版本的截断是_chsize- 请参阅http://msdn.microsoft.com/en-us//library/dk925tyb.aspx

int _chsize( 
   int fd,
   long size 
);

或者以只读方式打开您的文件,读取/替换某些字符串流,然后将所有内容放入您的文件中,这次打开以进行覆盖:

fstream someFile("t.txt", ios::binary|ios::in);
stringstream ss;
// copy (with replacing) whatever needed from someFile to ss 
someFile.close();
someFile.open("t.txt", ios::binary|ios::out|ios::trunc);
someFile << ss.rdbuf();
someFile.close();
于 2012-10-28T19:23:43.360 回答