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;

}

posted @ 2025-10-06 13:01  LOSOB  阅读(21)  评论(0)    收藏  举报