2013-04-24 1 views
1

Я хочу вставить некоторые поля и записи в файл, который я создал с помощью структуры. Я не уверен, если я задать вопрос в правильном направлении, но вот код, который я написал:C# Использование Struct для вставки полей и записей?

struct Student 
{ 
    public string Name; 
    public int Age; 
    public int ID; 
    public string Email; 
    public string Country; 
    public void ClearStudentInfo() 
    { 
     Name = ""; 
     Age = 0; 
     ID = 0; 
     Email = ""; 
     Country = ""; 
    } 

    static void Main(string[] args) 
    { 
     FileStream fsw = new FileStream("SomeFile.txt", FileMode.Append, FileAccess.Write); 
     StreamWriter Sw = new StreamWriter(fsw); 
     Sw.WriteLine("John", 22, 3254, "[email protected]", "United States"); 

     Sw.Close(); 
     fsw.Close(); 
    } 
} 

Когда я открываю файл Somefile.txt, он показывает Джону только и не остальные записи.

Можно ли вставить его гораздо более организованным способом? Для того, чтобы появиться в таблицах или в файле, как это:

Name: John 
Age: 22 
ID: 3254 
E-mail: [email protected] 
Country: United States 

И если я буду вставлять больше информации Student, что этот код будет применяться, чтобы сделать это или нет ?!

Любые ответы будут оценены.

спасибо.

+0

'WriteLine (" Name: "+ student.Name);' и делать это для каждой записи? или если вы хотите сделать что-то более общее, используйте отражение, чтобы напечатать имя поля, а затем его значение и затем. Формат CSV также является очень хорошей альтернативой. –

+0

Является ли цель этого текстового файла понятной для человека, машиносчитываемой или той и другой? Если машиночитаемое является одним из требований, вы должны изучить некоторую существующую реализацию сериализации, например. JSON или XML-сериализация. –

ответ

1
  1. Почему вы используете Struct? Read these? Я знаю, что вы отметили структуру, но я не вижу причин использовать ее здесь.

  2. StreamWriter.WriteLine не делает то, что вы думаете. Вы пытались использовать this, который не выписывает каждый элемент для вас.

  3. Как уже упоминалось г-ном Вселенной, вам лучше форматировать выход в обычном случае.Однако, см. Ниже, чтобы получить свой результат, как вы хотите. Если вы получите randy и хотите динамический вывод, вы можете сделать таблицу поиска или отражение.

    class Student 
    { 
        public string Name { get; set; } 
        public int Age { get; set; } 
        public int ID { get; set; } 
        public string Email { get; set; } 
        public string Country { get; set; } 
    
        public void ClearStudentInfo() 
        { 
         Name = ""; 
         Age = 0; 
         ID = 0; 
         Email = ""; 
         Country = ""; 
        } 
    
        public string FormatForOutput() 
        { 
         StringBuilder sb = new StringBuilder(); 
         sb.Append("Name: "); 
         sb.Append(Name); 
         sb.Append("\nAge: "); 
         sb.Append(Age); 
         sb.Append("\nID: "); 
         sb.Append(ID); 
         sb.Append("\nE-Mail: "); 
         sb.Append(Email); 
         sb.Append("\nCountry: "); 
         sb.Append(Country); 
         return sb.ToString(); 
        } 
    } 
    

    Используется StringBuilder для обеспечения эффективности 4+ конкатенаций. Reference

Затем вы можете сделать

var student = new Student() { Name = "John", Age = 22, ID = 3254, Email = "[email protected]", Country = "United StateS" }; 
    using (FileStream fsw = new FileStream("SomeFile.txt", FileMode.Append, FileAccess.Write)) 
    { 
     using (StreamWriter sw = new StreamWriter(fsw)) 
     { 
      sw.WriteLine(student.FormatForOutput()); 
     } 
    } 

«Использование» заявление заботится о закрытии потоков для вас, поэтому вам не придется беспокоиться об этом. См. here, хотя я ненавижу, что в примере не используется поток.

+0

Неясно, является ли намерение оригинального плаката типом представлять * ученик * или набор переменных, связанных вместе с клейкой лентой, которая может содержать информацию об ученике. Существование метода ClearStudentInfo предполагает последнее, и в этом случае класс struct или immutable будет казаться более подходящим, чем изменчивый класс. Метод экземпляра 'ClearStudentInfo' должен быть заменен либо статическим методом' GetBlankStudent', который возвращает struct, либо статическим методом 'Clear', который принимает параметр' ref' типа struct, но структуры инкапсулируют значения лучше, чем изменяемые классы. – supercat

+0

@supercat Если OP не в состоянии форматировать данные в этом простом формате, ему лучше использовать классы и получить знания ООП, будь то лучшее для его текущего случая или нет - он не знает. Или, может быть, он знает, что он делает, просто не знает C# достаточно, и в этом случае он может правильно проигнорировать изменение класса. – bland

+0

Каким будет эффект от var varStatus = dataSource.GetStudent (что угодно); myStudent.Age + = 1; 'быть на ученике, хранящемся в' dataSource'? Знать, что тип - это структура с открытым полем «Возраст», достаточно для определения поведения. Как насчет того, является ли это изменчивым классом? Что нужно знать, чтобы определить, на какие объекты может повлиять запись на «myStudent.Age»? Хотя использование типов изменяемых классов в качестве носителей значений может быть более результативным, чем использование неизменяемых типов классов, оно создает гораздо больше ошибок, чем любые неизменные типы классов или структуры открытого поля. – supercat

0

Вы дико путают, что значения параметров для WriteLine есть. У вас есть эта строка:

Sw.WriteLine("John", 22, 3254, "[email protected]", "United States"); 

Неясно, почему вы думаете, эта линия приведет к выходу вы ищете, но это вызов передает строку «John» и проходит в качестве дополнительных аргументов (до string.Format(...)) в значение 22, 3254, "[email protected]" и "United States" до этого способ. Поскольку вы не используете никаких токенов для замены строк (например, {0}), ваши дополнительные аргументы полностью исключены.

Поэтому неудивительно, что вы печатаете только «Джон».

Вы говорите, что вы хотите этот вывод:

Имя: John
Возраст: 22
ID: 3254
Электронная почта: [email protected]
Страна: США

Но как это могло быть выведено, когда вы никогда не выводите строки «Имя:», «Возраст», «Идентификатор:» и т. Д.?

0

Самый организованный способ вывода информации, которую вы хотите использовать CSV.

WriteLine("Name,Age,ID,E-Mail,Contry"); 
WriteLine("John,22,3254,[email protected],United States"); 
.... 

Это может быть легко прочитано программой и рассматривается как таблица с использованием Excel или аналогичного программного обеспечения для работы с электронными таблицами.

Смежные вопросы