c++ 文件的输出输出流(随意指定位置)
include<Windows.h>
include
include
include
include
using namespace std;
//定义一个获取当前文件的大小
long long getFileSize(const char * filename) //传递一个文件名的指针
{
fstream infile;
infile.open(filename); //打开文件
if (!infile.is_open())
{
cout << "文件打开失败:\n";
return 0;
}
infile.seekg(0,infile.end); //定位到文件的末尾位置
/* // tellg() 返回当前位置距文件开始的字符长度, 这里结合
infile.seekg(0,infile.end)->将逛遍定位到文件的末尾, 所以infile.tellg()是获取当前文件的长度
*/
return infile.tellg();
}
int main()
{
ifstream seekgReadFile; //随机读写文件流(输入流)
ofstream seekpwriteFile; //在指定的位置插入字符(输出流) 覆盖式
ofstream seekpinwriteFile; //在指定的位置插入字符(输出流) 插入式
string savedata; //存储文件
stringstream buffer; //文件缓冲
cout<<"文件的大小"<<getFileSize("随机读写文件调试.txt"); //调用计算文件大小的函数
seekpwriteFile.open("在指定的位置覆盖字符.txt");
seekgReadFile.open("随机读写文件调试.txt");
if (!seekpwriteFile.is_open()) //打开失败
{
cout << "文件打开失败:\n";
return 1;
}
/*c++的写入模式是覆盖式,不是插入式,下面的代码将直接覆盖后面的内容*/
seekpwriteFile << "湖南省湘西自治州.\n"; //向文件写数据 此时的光标位置已经在末尾
/* 现在要在党后面增加"1949年建立",所以就需要将光标移到党的后面
seekp(5,seekpwriteFile.beg)这里现将光标定位到文件的开始,在往前移5个字节*/
seekpwriteFile.seekp(4,seekpwriteFile.beg); //一个中文字符占两个字节
seekpwriteFile << "1949年建立"; //
/*c++的写入模式是覆盖式,不是插入式,上面的代码将直接覆盖后面的内容*/
if (!seekgReadFile.is_open()) //打开失败
{
cout << "文件打开失败:\n";
return 1;
}
/*从文件的末尾向前移10再开始读,中文,换行符占两位,字母 数字均占一位,末尾的空隔也算
例如文件的内容为:中国人名解放军,中华人民共和国始终坚持捍卫国家的主权 .文件的结尾多了10个空隔符
seekg(-12),结果读取到的数据为权,因为后面的10个空隔已经占用了10位,而每个中文占用两位 ,所以只能读取到权
如果是seekg(-11),结果读不出,因为1位不能完整的存储一个中文字符*/
seekgReadFile.seekg(-12,seekgReadFile.end);
while (!seekgReadFile.eof())
{
getline(seekgReadFile,savedata); //读写一行直到结束
cout << "读取到的数据是:" << savedata<<endl;
}
seekpinwriteFile.close();
seekpwriteFile.close();
seekgReadFile.close(); //关闭文件
system("pause");
return 0;
}

浙公网安备 33010602011771号