麻烦哪位高手帮我把文本文件中的5行中的“xxxxx”替换成“123456789123456789123456789”,不要覆盖下一行的文本。然后用@替换"123456789123456789123456789”中的第6位,然后将指针移到行尾。
急求实现代码,顺便解答一下我的代码后面注释得问题,谢谢。
我的基本思路是readstring读一行,替换或插入等处理当前行数据,再writestring写入文件(不能影响覆盖下一行),将指针移动到下一行,继续轮询读>处理>写。
不想把整个文件都放入数组处理后删除原来文件的再重生成新文件的方法。
刚才网友说:没法实现,总之,这个问题我多留几天,最后选最优的代码(包括删了文件再重写)
更改前的文件
99999
99999
xxxxx
99999
99999
要求更改后的文件
99999
99999
12345@789123456789123456789
99999
99999
下面是我写的代码,在插入"123456789123456789123456789”后总是会覆盖下一行。
while(file.ReadString(strText))
{
int dwPosStart = (DWORD)file.GetPosition() - (_tcslen(strText) + _tcslen(_T("\r\n")));//当前的行头。
if(strText.Find("xxxxx")>=0) //判断当前行是否存在xxxxx
{
file.Seek((dwPosStart), CFile::begin); //seek到行首
file.WriteString("123456789123456789123456789\r\n"); //从行头写入一串字符串,这里如何避免覆盖下一行?只覆盖当前行,指针如何返回行尾?
file.Seek(dwPosStart+5, CFile::begin); //seek到行首+5的位置
file.WriteString("@"); //将@行中插入代替6,
CString strTest;
//file.ReadString(strTest);//这里我想用readstring把指针移到行尾,但是反而把文件给改写了,为啥read能改文件数据?
file.Close();
break;
我的代码最后生成了这些,writestring和readstring连用后,readstring改变了文件内容!!!
99999
99999
12345@3456789123456789123456789
文本文件没有办法直接在文件里替换一个长度不同的内容,唯一的办法是全部读取到内存,修改,再写回去。
代码这次就不写了,以免别人的回答更好,或者lz有需求的变更,那就白费力气了。
利用CStdioFile读写文件(逐行读取)
CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。
比如:写入文件的例子
//创建文件
CStdioFile file;
file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
//写入文件
CString str;
str.Format("%s\r\n","hello!I am talkingmute!");(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)
file.Seek(0,CFile::end);
file.WriteString( str );
//关闭文件
file.Close();
比如:读文件的例子
CString strText = “”;
CString szLine = “”;
//打开文件
CStdioFile file;
file.Open("ts.txt",CFile::modeRead);
//逐行读取字符串
while( file.ReadString( szLine ) )
{
strText += szLine;
}
MessageBox(strText);
//关闭文件
file.Close();
利用CStdioFile读写文件(逐行读取)
CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。
比如:写入文件的例子
//创建文件
CStdioFile file;
file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
//写入文件
CString str;
str.Format("%s\r\n","hello!I am talkingmute!");(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)
file.Seek(0,CFile::end);
file.WriteString( str );
//关闭文件
file.Close();
比如:读文件的例子
CString strText = “”;
CString szLine = “”;
//打开文件
CStdioFile file;
file.Open("ts.txt",CFile::modeRead);
//逐行读取字符串
while( file.ReadString( szLine ) )
{
strText += szLine;
}
MessageBox(strText);
//关闭文件
file.Close();
https://blog.csdn.net/xuyuefei1988/article/details/7945253
想做到可以,但用CstdioFile就实现不了,如果是打开文件,判断为止,模拟键盘输出,想来是可行的