C#记事本一样的文件读取

时间:2009-03-28 10:19:26

标签: c#

我有一个档案。当我在记事本中打开它时,我会看到一行中的字符串。但是,如果我在WordPadNotepad++等任何其他应用程序中打开该文件。我可以看到charachters之间的不规则换行符,它们出现在多行中。如果我reader.Readline(),也会出现这些换行符。如何在C#中执行类似行读取的记事本?

4 个答案:

答案 0 :(得分:4)

这种差异通常是因为文件编码使用的模糊性。如果您希望文件正确解析,则需要使用正确的编码。什么字符导致问题?此外 - 如果所使用的编码中的字节不合法,则所有投注均关闭;-p

您可以在文件上创建(例如)StreamReader时指定编码:

    using (Stream stream = File.OpenRead(path))
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }

发布base-64后,问题是该行中间的\r。要将其作为基本字符串阅读,您可以使用:

 byte[] data = File.ReadAllBytes(path);
 string txt = Encoding.UTF8.GetString(data);

或只是:

 string text = File.ReadAllText("foo.txt");

但是,显示此内容总是很困难。您现在可以在选择的行结尾处Split(可能是crlf)。 StreamReader正在拆分任何看起来像 行结尾的内容。

string[] lines = s.Split(new string[] {"\r\n"}, StringSplitOptions.None);

答案 1 :(得分:2)

很抱歉我的第二个回答,但我刚刚意识到你可以使用peek来获取下一个字符并检查当前和下一个是否是\ r \ n,如下:

var path = "c:/test.txt";

File.WriteAllText(path, "a\nb\r\nc");

using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream, Encoding.ASCII))
{
    var lineBuilder = new StringBuilder();
    string line;
    char currentChar;
    int nextChar;
    while (!reader.EndOfStream)
    {
        currentChar = (char)reader.Read();
        nextChar = reader.Peek();

        if (!(currentChar == '\r' && nextChar == '\n'))
        {
            lineBuilder.Append(currentChar);
        }

        if((currentChar == '\r' && nextChar == '\n') || nextChar == -1)
        {
            line = lineBuilder.ToString();
            Console.WriteLine(line);

            lineBuilder = new StringBuilder();

            reader.Read();
        }
    }
}

答案 2 :(得分:0)

如果这不是那么重要,你可以加载所有文本并使用正则表达式将其拆分成行,

var path = "c:/test.txt";

File.AppendAllText(path, "lala\nlala\nlalal");
var text = File.ReadAllText(path);

Console.WriteLine(Regex.Split(text, Environment.NewLine).Length);

答案 3 :(得分:0)

使用

String[] lines = File.ReadAllLines("c:\\text.txt");

一次性提取所有行