日期:2014-05-19  浏览次数:21064 次

请问 如何修改文本文件的最后一行内容?
我有一文本文件,例如:
A     B
C     D
E     F

我现在想把最后一行E     F   改成     1       2,
A     B
C     D
1     2

请问怎么实现?

如果不能直接修改,我想先删除最后一行
A     B
C     D

然后再追加   1     2

A     B
C     D
1     2

这样又怎么实现呢?




------解决方案--------------------
先算出你文体有多少行,这需要你先读一遍文本,然后再读一遍,到最后一行的时候做替换

或者还有一种方法,用两个游标(c++里叫指针)一个用来记录前面的,另一个用来记录后面的,如果前面的走到文本的结尾了,那就把后面的替换了
------解决方案--------------------
'应该与查找替换差不多吧!
Option Explicit
Private Sub Command1_Click()
Call ReplaceInFile( "C:\test.txt ", "x ", "10000 ")
End Sub

Private Sub ReplaceInFile(FileName As String, ReplaceStr As String, ReplaceWithStr As String)
Dim FileNum As Long, strFileContent As String, strTemp As String

FileNum = FreeFile

If Dir(FileName) <> " " Then
Open FileName For Input As #FileNum
While Not EOF(FileNum)
Line Input #FileNum, strTemp
strFileContent = strFileContent & strTemp & vbCrLf
Wend
Close #FileNum

strFileContent = Replace(strFileContent, ReplaceStr, ReplaceWithStr, , , vbDatabaseCompare)

Open FileName For Output As #FileNum
Print #FileNum, strFileContent
Close #FileNum

End If
End Sub

------解决方案--------------------
如果文件很大(几百M以上),就指定一个data buffer,然后一块一块读,直到吃到最后一块,记录最后一行开始处到EOF的offset,sw.basestream.seek(offset. seekorigin.end);// sw is a StreamWriter object;开始替换,然后sw.flush;
如果文件不大,直接readtoend,然后回写
------解决方案--------------------
如果文件很大(几百M以上),就用FileStream打开二进制方式读写,
指定一个data buffer,然后seek到倒数第一块,一块一块读,直到找到最后一个回车换行的位置,seek到此位置,写入即可~
------解决方案--------------------
private void button1_Click(object sender, EventArgs e)
{
FileStream vFileStream = new FileStream(@ "c:\temp\temp.log ",
FileMode.Open, FileAccess.ReadWrite);
byte[] vBuffer = new byte[0x1000];
int vReadLength;
int vReadCount = 0;
bool vLineEnd = false;
int j = 0;
string vText = "Zswang 路过 " + DateTime.Now.ToString();
do
{
vFileStream.Seek(-vBuffer.Length * ++vReadCount, SeekOrigin.End);
vReadLength = vFileStream.Read(vBuffer, 0, vBuffer.Length);
for (int i = vReadLength - 1; i > = 0; i--)
{
j++;
if (vBuffer[i] == 10)
{
if (j == 1)
{
vLineEnd = true;
continue;
}
if (vReadCount > 1)
{
vBuffer = new byte[vFileStream.Length - j - 1];
vFileStream.Seek(j, SeekOrigin.End);
vReadLength = vFileStream.Read(vBuffer, 0, vBuffer.Length);
j = 0;
}
//textBox1.Text = Encoding.Default.GetString(vBuffer,
// vReadLength - j + 1, j - 1); //读出最后一行
vFileStream.SetLength(vFileStream.Length - (j - 1));