C# 替换第n个位置的字符

C# 替换第n个位置的字符,c#,asp.net,C#,Asp.net,我写这个程序是为了替换文本文件中字符串第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 fo

我写这个程序是为了替换文本文件中字符串第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语言编写的完整代码#


我哪里出错了?请帮忙

因为你的逻辑是:

  • 对于每个文件
    • 打开文件
    • 对于文件中的每一行
      • 处理它
      • 重新打开文件进行写入
      • 写一行
这意味着您重复使用最新的行覆盖文件。最后,每个文件只包含一行:最后一行

你会想做这样的事情:

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;
}
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;
}
您需要添加一些
try/catch/finally
异常处理来处理文件出现问题的情况,以便将该文件回滚到其原始状态

其他选择是

  • 打开文件进行读取
  • 使用
    File.ReadAllLines()
    或等效文件读取整个内容
  • 根据需要变换线条
  • 重新打开原始文件进行写入
  • 将转换后的内容吐出到原始文件中
这让你想到这样的事情:

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;
}
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;
}
static void Main(字符串[]args)
{
foreach(参数中的字符串文件名)
{
string[]lines=File.ReadAllLines(文件名);
对于(int i=0;i
在旁注上,但仍然相关。您是否考虑使用正则表达式替换所有行?


/(?对第二个foreach循环进行写操作,将其替换为字符串数组。然后将字符串数组写入第一个foreach循环下的文件中。这将解决您的逻辑问题。

我在每个设置为false的新文件开头创建了一个布尔追加,因此它会为第一行创建一个新文件,然后设置append=tr因此,每个后续行都附加在

var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt");
foreach (string currentFile in txtFiles)
{
    var append = false;
    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, append))
        {
            outfile.Write(theString.ToString() + Environment.NewLine);
        }
        append = true;
    }
}

这实际上可能是最后一行,因为您在每次循环迭代中都会覆盖文件
它只是在最后一行追加新字符串。如果您的写入有一个额外的步骤我忘记了,因为您读取的是您正在写入的同一个文件,请检查我的回答。我在写入该文件时遇到问题
var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt");
foreach (string currentFile in txtFiles)
{
    var append = false;
    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, append))
        {
            outfile.Write(theString.ToString() + Environment.NewLine);
        }
        append = true;
    }
}