这应该非常简单。我只是想从一个由空格分隔的标记组成的文本文件中读取数字和单词。你是怎么用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文件也是一个很好的例子,说明为什么要在读入完整令牌后立即停止读取文件。
答案 0 :(得分:26)
Brannon的回答解释了如何读取二进制数据。如果你想阅读 text 数据,你应该阅读字符串然后解析它们 - 当然还有内置方法。
例如,要读取包含数据的文件:
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();
}
请注意,这没有错误处理。特别是,如果文件不存在,前两行有不适当的数据,或者少于两行,它将抛出异常。如果文件只有两行,它会在null
中保留z
的值。
对于可以更优雅地失败的更健壮的解决方案,您需要检查reader.ReadLine()
是否返回null
(表示文件的结尾)并使用int.TryParse
和{{1而不是double.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
读取整个文件然后使用正则表达式来拆分它。那时我想知道你是如何表示一个包含空格的字符串。
根据我的经验,你通常比这更了解格式 - 是否会有一个行分隔符,或者用空格分隔的同一行中的多个值等。
我还要补充说,混合二进制/文本格式通常很难处理。简单而有效的文本处理往往会读入缓冲区,如果存在二进制数据,则会成为问题。如果您需要二进制文件中的文本部分,通常最好包括一个长度前缀,以便只能解码该数据。
答案 1 :(得分: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();
}
答案 2 :(得分:4)
我喜欢使用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);
}
答案 3 :(得分:3)
不完全是您的问题的答案,但只是考虑您是否是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
方法将创建一个包含以下内容的文件:
<Configuration>
<intVal>0</intVal>
<floatVal>0.0</floatVal>
<stringVal></stringVal>
</Configuration>
这种方法的好处是,如果您的Save
类发生更改,则无需更改Load
和Configuration
方法。
答案 4 :(得分:0)
尝试这样的事情:
http://stevedonovan.blogspot.com/2005/04/reading-numbers-from-file-in-c.html
恕我直言可能要阅读一篇c#教程,在询问之前要牢记整个画面是非常有用的
答案 5 :(得分:0)
C#似乎没有像C ++这样的格式化流阅读器(我很乐意予以纠正)。因此Jon Skeet将内容读取为字符串并将其解析为所需类型的方法将是最好的。
答案 6 :(得分:0)
这是我的代码,用于从文本文件中读取数字。它演示了从文本文件“ 2 3 5 7 ...”中读取数字的概念。
public class NumberReader
{
StreamReader reader;
public NumberReader(StreamReader reader)
{
this.reader = reader;
}
public UInt64 ReadUInt64()
{
UInt64 result = 0;
while (!reader.EndOfStream)
{
int c = reader.Read();
if (char.IsDigit((char) c))
{
result = 10 * result + (UInt64) (c - '0');
}
else
{
break;
}
}
return result;
}
}
以下是使用此类的示例代码:
using (StreamReader reader = File.OpenText("numbers.txt"))
{
NumberReader numbers = new NumberReader(reader);
while (! reader.EndOfStream)
{
ulong lastNumber = numbers.ReadUInt64();
}
}