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

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

ifstream in("file.txt"); int int_val; float float_val; string string_val; in >> int_val >> float_val >> string_val; in.close(); 

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

 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); 

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

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

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

 10 10.5 hello 

您可以使用:

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

请注意,这没有error handling。 特别是,如果文件不存在,前两行有不适当的数据,或者少于两行,它将抛出exception。 如果文件只有两行,它将在z保留null值。

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

这假设值之间有一个行分隔符。 如果你真的想读这样的字符串:

 10 10.5 hello 

然后代码将非常相似:

 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]; } 

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

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

根据我的经验,您通常比格式更了解格式 – 是否存在行分隔符,或者在由空格分隔的同一行中的多个值等。

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

 using (FileStream fs = File.OpenRead("file.txt")) { BinaryReader reader = new BinaryReader(fs); int intVal = reader.ReadInt32(); float floatVal = reader.ReadSingle(); string stringVal = reader.ReadString(); } 

我喜欢使用StreamReader来快速轻松地访问文件。 就像是….

  String file = "data_file.txt"; StreamReader dataStream = new StreamReader(file); string datasample; while ((datasample = dataStream.ReadLine()) != null) { // datasample has the current line of text - write it to the console. Console.Writeline(datasample); } 

不完全是您的问题的答案,但只是考虑您是否是C#的新手:如果您使用自定义文本文件来读取某些配置参数,您可能需要检查.NET中的XML序列化主题。

XML序列化提供了一种编写和读取XML格式文件的简单方法。 例如,如果您有这样的配置类:

 public class Configuration { public int intVal { get; set; } public float floatVal { get; set; } public string stringVal { get; set; } } 

你可以简单地保存它并使用XmlSerializer类加载它:

 public void Save(Configuration config, string fileName) { XmlSerializer xml = new XmlSerializer(typeof(Configuration)); using (StreamWriter sw = new StreamWriter(fileName)) { xml.Serialize(sw, config); } } public Configuration Load(string fileName) { XmlSerializer xml = new XmlSerializer(typeof(Configuration)); using (StreamReader sr = new StreamReader(fileName))) { return (Configuration)xml.Deserialize(sr); } } 

如上定义的Save方法将创建一个包含以下内容的文件:

  0 0.0   

这种方法的好处是,如果Configuration类发生更改,则无需更改SaveLoad方法。

尝试像这样:

http://stevedonovan.blogspot.com/2005/04/reading-numbers-from-file-in-c.html

恕我直言可能要阅读ac#tutorial,在询问之前考虑整个画面是非常有用的

C#似乎没有像C ++这样的格式化流阅读器(我很乐意得到纠正)。 因此,Jon Skeet将内容作为字符串读取并将其解析为所需类型的方法将是最好的。