从C#中的文本文件中读取数字

Joe*_*Joe 19 c# text file

这应该是非常简单的.我只是想从一个由空格分隔的标记组成的文本文件中读取数字和单词.你是怎么用C#做的?例如,在C++中,以下代码将用于读取整数,浮点数和单词.我不想使用正则表达式或编写任何特殊的解析代码.

ifstream in("file.txt");
int int_val;
float float_val;
string string_val;
in >> int_val >> float_val >> string_val;
in.close();
Run Code Online (Sandbox Code Playgroud)

此外,每当读取令牌时,应该读入令牌之外的不超过一个字符.这允许进一步的文件读取取决于读取的令牌的值.作为具体的例子,考虑一下

string decider;
int size;
string name;

in >> decider;
if (decider == "name")
    in >> name;
else if (decider == "size")
    in >> size;
else if (!decider.empty() && decider[0] == '#')
    read_remainder_of_line(in);
Run Code Online (Sandbox Code Playgroud)

解析二进制PNM文件也是一个很好的例子,说明为什么要在读入完整令牌后立即停止读取文件.

Jon*_*eet 26

Brannon的答案解释了如何读取二进制数据.如果你想阅读文本数据,你应该阅读字符串,然后解析它们 - 当然,有内置的方法.

例如,要读取包含数据的文件:

10
10.5
hello
Run Code Online (Sandbox Code Playgroud)

您可以使用:

using (TextReader reader = File.OpenText("test.txt"))
{
    int x = int.Parse(reader.ReadLine());
    double y = double.Parse(reader.ReadLine());
    string z = reader.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

请注意,这没有错误处理.特别是,如果文件不存在,前两行有不适当的数据,或者少于两行,它将抛出异常.它会留下的值nullz,如果该文件只有两行.

对于可以更优雅地失败的更强大的解决方案,您可能希望检查是否reader.ReadLine()返回null(指示文件的结尾)并使用int.TryParsedouble.TryParse不是Parse方法.

假设值之间存在行分隔符.如果你真的想读这样的字符串:

10 10.5 hello
Run Code Online (Sandbox Code Playgroud)

然后代码将非常相似:

using (TextReader reader = File.OpenText("test.txt"))
{
    string text = reader.ReadLine();
    string[] bits = text.Split(' ');
    int x = int.Parse(bits[0]);
    double y = double.Parse(bits[1]);
    string z = bits[2];
}
Run Code Online (Sandbox Code Playgroud)

同样,您需要执行适当的错误检测和处理.请注意,如果文件实际上只包含一行,您可能需要使用File.ReadAllText,以使其稍微简单一些.还有File.ReadAllLines将整个文件读入字符串数组的行.

编辑:如果您需要按任何空格分割,那么您可能最好先阅读整个文件,File.ReadAllText然后使用正则表达式将其拆分.那时我想知道你是如何表示一个包含空格的字符串.

根据我的经验,你通常比这更了解格式 - 是否会有一个行分隔符,或者是用空格分隔的同一行中的多个值等.

我还要补充说,混合二进制/文本格式通常很难处理.简单而有效的文本处理往往会读入缓冲区,如果存在二进制数据,则会成为问题.如果您需要二进制文件中的文本部分,通常最好包括一个长度前缀,以便只能解码该数据.


Bra*_*non 10

using (FileStream fs = File.OpenRead("file.txt"))
{
    BinaryReader reader = new BinaryReader(fs);

    int intVal = reader.ReadInt32();
    float floatVal = reader.ReadSingle();
    string stringVal = reader.ReadString();
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是从 * 二进制 * 文件而不是文本文件中读取。特别是,内容为“10 10.5 hello”的文件不会按您的预期读取。不过,这很可能与 C++ 行为相匹配,但我不确定......很可能是 OP 只是滥用了“文本文件”这个短语。 (2认同)