Считайте числа из текстового файла в C#

Это - что-то, что должно быть очень просто. Я просто хочу считать числа и слова от текстового файла, который состоит из маркеров, разделенных пробелом. Как дела это в 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 является также хорошим примером того, почему требуется прекратить читать файл, как только полный маркер читается в.

19
задан Joe 29 December 2009 в 10:10
поделиться

5 ответов

Ответ Брэннона объясняет, как читать двоичные данные . Если вы хотите прочитать данные 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, а затем использовать регулярное выражение, чтобы разделить его. В этот момент я действительно задаюсь вопросом, как вы представляете строку, содержащую пробел.

По моему опыту вы обычно знаете больше о формате, чем это - будет ли разделитель строк, или несколько значений в одной строке, разделенных пробелами, и т.д.

Я бы также добавил, что смешанные двоичные/текстовые форматы в целом неприятны для работы. Простая и эффективная работа с текстом имеет тенденцию читать в буфер, что становится проблематичным, если есть еще и двоичные данные. Если вам нужна текстовая секция в бинарном файле, обычно лучше включить префикс длины, чтобы можно было декодировать только эту часть данных.

.
26
ответ дан 30 November 2019 в 03:02
поделиться

Не совсем ответ на ваш вопрос, а просто идея, которую стоит рассмотреть, если вы новичок в 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 класс изменится.

4
ответ дан 30 November 2019 в 03:02
поделиться

Мне нравится использовать 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);
  }
4
ответ дан 30 November 2019 в 03:02
поделиться
using (FileStream fs = File.OpenRead("file.txt"))
{
    BinaryReader reader = new BinaryReader(fs);

    int intVal = reader.ReadInt32();
    float floatVal = reader.ReadSingle();
    string stringVal = reader.ReadString();
}
.
10
ответ дан 30 November 2019 в 03:02
поделиться

Попробуй что-нибудь вроде этого:

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

IMHO Может быть, для того, чтобы прочитать учебник c#, будет действительно полезно иметь в виду всю картину, прежде чем спрашивать

.
0
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: