Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换文本文件中的单词_C#_File_Text_Replace_Streamwriter - Fatal编程技术网

C# 替换文本文件中的单词

C# 替换文本文件中的单词,c#,file,text,replace,streamwriter,C#,File,Text,Replace,Streamwriter,我正在做一个小程序,其中一些用户保存的数据存储在一个文本文件中。我正在使用system.IO和Streamwriter将新信息写入文本文件 文件中的文本格式如下: 名称1、1000、387 姓名2200144 。。。等等我使用infos=line.Split(',')将不同的值返回到一个数组中,该数组对于搜索更有用。我所做的是使用While循环搜索正确的行(名称匹配的位置),然后使用infos[1]返回点数 我想修改这个infos[1]值并将其设置为其他值。我正试图找到一种方法来替换C#中的一个

我正在做一个小程序,其中一些用户保存的数据存储在一个文本文件中。我正在使用
system.IO
Streamwriter
将新信息写入文本文件

文件中的文本格式如下:

名称1、1000、387
姓名2200144

。。。等等我使用
infos=line.Split(',')
将不同的值返回到一个数组中,该数组对于搜索更有用。我所做的是使用
While
循环搜索正确的行(名称匹配的位置),然后使用
infos[1]
返回点数

我想修改这个
infos[1]
值并将其设置为其他值。我正试图找到一种方法来替换C#中的一个单词,但我找不到一个好方法。据我所知,没有办法替换一个单词,你必须重写整个文件

有没有办法完全删除一行,这样我就可以在文本文件末尾重写它,而不用担心它被复制


我尝试使用
Replace
关键字,但没有成功。看到针对类似问题提出的答案,我有点不知所措,因此如果有人能向我解释一下我的选择,我将不胜感激。

很可能你是C#新手,没有意识到字符串是不可变的(这是一种说你不能更改它们的奇特方式)。您只能通过修改旧字符串来获取新字符串:

String MyString = "abc 123 xyz";

MyString.Replace("123", "999");  // does not work

MyString = MyString.Replace("123", "999");  // works
[编辑:]

如果我理解你的后续问题,你可以这样做:

infos[1] = infos[1].Replace("1000", "1500");

如果我理解正确,您可以使用
File.ReadLines
方法和
LINQ
来完成此操作。首先,获取所需的行:

var line = File.ReadLines("path")
           .FirstOrDefault(x => x.StartsWith("name1 or whatever"));

if(line != null)
{
    /* change the line */
}
然后将新行写入文件,不包括旧行:

var lines = File.ReadLines("path")
                .Where(x => !x.StartsWith("name1 or whatever"));

var newLines = lines.Concat(new [] { line });

File.WriteAllLines("path", newLines);

您正在寻找的概念称为文件读/写的“随机访问”。C#中大多数易于使用的I/O方法都是“SequentialAccess”,这意味着您可以读取一个块或一行,然后前进到下一个块或行

然而,您想要做的是可能的,但是您需要阅读一些关于文件流的教程。这里有一个相关的问题

您可能正在读取整个文件,或者作为搜索的一部分逐行读取它。如果字段长度固定,则可以读取固定数量的字节,跟踪
流。读取时定位
,知道要读取和需要替换的字符数,然后打开文件进行写入,移动到流中的确切位置,并写入新值


如果你对streams还不熟悉,这有点复杂。如果您的文件不是很大,System.IO库可以非常高效地逐行复制文件,如果编码正确,那么您可以按照第二个建议,即逐行读取文件,将其写入新流(内存、临时文件等),在达到该值时替换有问题的行,完成后,替换原代码。

显示您当前的代码为什么否决?这就是OP所说的:“我试着使用Replace关键字,但是没有用。”谢谢你的快速回复,如果我使用
MyString=MyString.Replace(“1000”,“1500”)
,然后将
infos[1]
设置为
MyString
,它可以工作吗?你甚至可以使用
infos[1]=infos[1]。Replace(“1000”,“1500”)但是,您是否将字符串替换与更新文件相混淆?从文件中读取字符串后,该字符串将在内存中。更改它只会在内存中更改它<代码>替换
不会将新值写回文件。您必须将文件编写作为代码的一部分……Selmann22的建议非常优雅
ReadLines
/
WriteAllines
…我甚至不知道的来自4.0的精彩添加。很荣幸能指出他们@mdisibio是的,它们在处理文本文件时非常有用。非常感谢(也感谢@mdisibio),我的问题是如何在文本文件中更新它,而不仅仅是如何修改内存中的值。在接下来的问题中,我会尽量说得更清楚。:)