Это - что-то, что должно быть очень просто. Я просто хочу считать числа и слова от текстового файла, который состоит из маркеров, разделенных пробелом. Как дела это в C#? Например, в C++, следующий код работал бы для чтения целого числа, плавания и слова. Я не хочу должным быть использовать regex или писать любой специальный код парсинга.
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 является также хорошим примером того, почему требуется прекратить читать файл, как только полный маркер читается в.
Ответ Брэннона объясняет, как читать двоичные данные . Если вы хотите прочитать данные 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
, если файл содержит только две строки.
Для более надежного решения, которое может дать более изящный сбой, вы захотите проверить, является ли читателем. ReadLine()
возвращает null
(указывая конец файла) и использует int.TryParse
и 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
, который считывает весь файл в массив строк.
EDIT: Если вам нужно разделить на любые пробелы, то лучше всего читать весь файл с помощью File.ReadAllText
, а затем использовать регулярное выражение, чтобы разделить его. В этот момент я действительно задаюсь вопросом, как вы представляете строку, содержащую пробел.
По моему опыту вы обычно знаете больше о формате, чем это - будет ли разделитель строк, или несколько значений в одной строке, разделенных пробелами, и т.д.
Я бы также добавил, что смешанные двоичные/текстовые форматы в целом неприятны для работы. Простая и эффективная работа с текстом имеет тенденцию читать в буфер, что становится проблематичным, если есть еще и двоичные данные. Если вам нужна текстовая секция в бинарном файле, обычно лучше включить префикс длины, чтобы можно было декодировать только эту часть данных.
.Не совсем ответ на ваш вопрос, а просто идея, которую стоит рассмотреть, если вы новичок в C#: Если Вы используете пользовательский текстовый файл для чтения некоторых параметров конфигурации, возможно, Вы захотите проверить темы сериализации XML в .NET.
Сериализация XML предоставляет простой способ записи и чтения XML-форматированных файлов. Например, если у Вас есть такой класс конфигурации:
public class Configuration
{
public int intVal { get; set; }
public float floatVal { get; set; }
public string stringVal { get; set; }
}
Вы можете просто сохранить его и загрузить, используя XmlSerializer
class:
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
класс изменится.
Мне нравится использовать 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);
}
using (FileStream fs = File.OpenRead("file.txt"))
{
BinaryReader reader = new BinaryReader(fs);
int intVal = reader.ReadInt32();
float floatVal = reader.ReadSingle();
string stringVal = reader.ReadString();
}
. Попробуй что-нибудь вроде этого:
http://stevedonovan.blogspot.com/2005/04/reading-numbers-from-file-in-c.html
IMHO Может быть, для того, чтобы прочитать учебник c#, будет действительно полезно иметь в виду всю картину, прежде чем спрашивать
.