gpt4 book ai didi

c# - 替换第n个位置的一个字符

转载 作者:太空狗 更新时间:2023-10-29 21:08:25 25 4
gpt4 key购买 nike

我正在编写这个程序来替换文本文件中字符串第 n 个位置的字符。我的文本文件包含以下内容 -

the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog

这是代码的输出-

thehuick brown fox jumped over the lazy dog

上面的结果不是我想要的。只有一行被更新,其余的在文件中不再存在。

这是我用 C# 编写的完整代码

        var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt");
foreach (string currentFile in txtFiles)
{
string[] lines = File.ReadAllLines(currentFile);
foreach (string line in lines)
{

var theString = line;
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "h");
theString = aStringBuilder.ToString();
using (StreamWriter outfile = new StreamWriter(currentFile))
{
outfile.Write(theString.ToString());
}

Console.WriteLine(theString);
Console.ReadKey();

}
}

我哪里做错了?请帮忙!

最佳答案

因为你的逻辑是这样的:

  • 对于每个文件
    • 打开文件
    • 文件中的每一行
      • 处理它
      • 重新打开文件进行写入
      • 写下这行

这意味着您用最新的行重复覆盖文件。最后,每个文件只包含一行:最后一行。

你会想做这样的事情:

static void Main(string[] args)
{
foreach ( string fileName in args )
{
string tempFileName = Path.GetTempFileName() ;

using ( Stream tmpFile = File.Open( tempFileName , FileMode.OpenOrCreate , FileAccess.Write , FileShare.None ) )
using ( StreamWriter output = new StreamWriter( tgtFile , Encoding.Default ) )
using ( Stream srcFile = File.Open( fileName , FileMode.Open , FileAccess.ReadWrite , FileShare.None ) )
using ( StreamReader input = new StreamReader( srcFile , Encoding.Default , true ) )
{
string line ;
while ( null != (line=input.ReadLine()) )
{
output.Write( line.Substring(0,3) ) ;
output.Write( 'h' ) ;
output.WriteLine( line.Substring(5) ) ;
}
}

string backupFileName = string.Format( "{0}.{1:yyyy-MM-dd.HHmmss}.bak" , fileName , DateTime.Now ) ;

File.Move( fileName , backupFileName ) ;
File.Move( tempFileName , fileName ) ;
File.Delete( backupFileName ) ;

}
return;
}

您需要添加一些 try/catch/finally异常处理以处理文件出错的情况,因此您可以将该文件回滚到其原始状态。

其他选项是

  • 打开文件进行阅读。
  • File.ReadAllLines() 吞下全部内容或同等条件
  • 按照您认为合适的方式变换线条
  • 重新打开原始文件进行写入
  • 将转换后的内容输出到原始文件中。

这会让你想到这样的事情:

static void Main(string[] args)
{
foreach ( string fileName in args )
{
string[] lines = File.ReadAllLines( fileName ) ;

for ( int i = 0 ; i < lines.Length ; ++i )
{
lines[i] = ApplyTransformHere( lines[i] ) ;
}

File.WriteAllLines( fileName , lines ) ;

}

return;
}

关于c# - 替换第n个位置的一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31662282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com