Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > запись в файл, чтение из файла в .NET


Автор: akaineco 24.1.2005, 08:45
Запись в файл, чтение из файла.
В MSDN по этому вопросу мне удалось найти только это:
Код

using (StreamWriter sw = new StreamWriter(path))
           {
               sw.WriteLine("This");
               sw.WriteLine("is some text");
               sw.WriteLine("to test");
               sw.WriteLine("Reading");
           }



поковырямшись в инете нашел еще кучу классов, и основательно в них запутался. Хотелось бы проконсультироваться, что мне лучше юзать для решения следующей задачи:

I. можно работать с файлом последовательного доступа, тогда

1. я должен иметь возможность считать символ с определенным
порядковым номером. Только один символ. Считать в
оперативку весь файл и затем найти нужный символ методом
тотального перебора — такое некатит.

2. Должна быть возможность записи символа в место, определенное
порядковым номером этого символа. Если на этом месте уже есть
символ, то он должен быть перезаписан.

II. Если ничего подобного нет при работе с файлами последовательного
доступа, то придется воспользоваться файлом произвольного доступа,
но никакой информации по работе с файлами произвольного доступа
я пока не нашел. Не хотелось бы усложнять программку базой данных.

III. Еще хотелось бы выяснить, можно ли записать в файл не символ или байт,
а один бит, т. е. единичку или нолик?


Автор: Domestic Cat 24.1.2005, 08:49
Посмотри FileStream.

Автор: [Last]Wizard 24.1.2005, 13:50
Цитата(Domestic @ 24.1.2005, 07:49)
Посмотри FileStream.

Это точно smile

Вот тебе пример:
Код
// Открываем файл на чтение и запись:
FileStream fs = new FileStream(@"C:\MyFile.txt", FileMode.Open, FileAccess.ReadWrite);

// Читаем 12-й байт от начала: (нумерация с нуля)
fs.Seek(11, SeekOrigin.Begin);
byte b = (byte)fs.ReadByte();

// Записываем его на место 4-го байта от конца: (нумерация с -1)
fs.Seek(-4, SeekOrigin.End);
fs.WriteByte(b);

// Закрываем файл:
fs.Close();


Насчет побитовой записи ничего не знаю, но в принципе можно реализовать через чтение и запись байтов.

Автор: akaineco 25.1.2005, 03:25
Через FileStream мы читаем байты, т. е. фактически числа.

Код

using(FileStream fs = new FileStream("TestFile.txt", FileMode.Open, FileAccess.Write ))
  {
   byte a = new byte ();
   
   a=0;
   fs.Seek(0, SeekOrigin.Begin);
   fs.WriteByte (a);
   fs.Seek(1, SeekOrigin.Begin);
   a=1;
   fs.WriteByte (a);
   fs.Seek(2, SeekOrigin.Begin);
   a=2;
   fs.WriteByte (a);
   fs.Close();
  }
  using(FileStream fsr = new FileStream("TestFile.txt", FileMode.Open, FileAccess.Read  ))
  {
   
   fsr.Seek(2, SeekOrigin.Begin);
   //в текстовое поле выводиться число.
   textBox1.Text =fsr.ReadByte ().ToString();
   fsr.Close();
  }

А как насчет букв и символов? Есть еще BinaryWriter BinaryReader.
Код

FileStream fse = new FileStream("TestFile.txt", FileMode.Open, FileAccess.Write );
 
  BinaryWriter bw = new BinaryWriter(fse);
   
   
    char a = new char ();
    a='6';
    bw.Seek(0, SeekOrigin.Begin);
    bw.Write  (a);
    bw.Seek(1, SeekOrigin.Begin);
    a='1';
    bw.Write (a);
    bw.Seek(2, SeekOrigin.Begin);
    a='2';
    bw.Write (a);

 
   fse.Close();
FileStream fse2 = new FileStream("TestFile.txt", FileMode.Open, FileAccess.Read );
  BinaryReader br = new BinaryReader(fse2);
  textBox1.Text = br.ReadChar().ToString ();
   fse2.Close();

записываем без проблем, а куда при чтении у fse2 метод seek девался? - Слоники снюхали?
приходиться читать попорядку одного за другим. Или может следует считать сначала быйт, а затем есть какой-то способ перевести его в конкретный символ ?
Цитата
Насчет побитовой записи ничего не знаю, но в принципе можно реализовать через чтение и запись байтов.


да, я тоже об этом думал.

Автор: Gazon 25.1.2005, 05:26
Цитата
А как насчет букв и символов?

Используй StreamReader.
Код
using(StreamReader fs = File.OpenText("D:\\Text.txt"))
      {
       string temp;
        while((temp=fs.ReadLine())!=null)
                                                                        ....
       }

Автор: akaineco 26.1.2005, 02:26
Цитата
using(StreamReader fs = File.OpenText("D:\\Text.txt"))
{
string temp;
while((temp=fs.ReadLine())!=null)
}

че-то не Компилируется.

Цитата
Используй StreamReader.

но мне нужно только символ считать, а ReadLine читает строку, причем с начала файла, а не с произвольного места. Есть еще метод read, который читает файл в массив. Если массив сделать величиной в один символ, то можно считать символ, но не с произвольной позиции:

Код

using (StreamReader sr = new StreamReader("MyTest.txt"))
  {
   char[] c = null;
   c = new char[1];
   sr.Read(c, 0, 1);
   //где 0-позиция в массиве в которую считываются символы. 1-количество
   //считываемых в массив символов.
   textBox1.Text =c[0].ToString ();
  }

метод seek отсутствует. А при записи методом write происходит полная перезапись всего файла. Старые даные не сохраняются, чего мне совсем не надо:
Код

using (StreamWriter sw = new StreamWriter("MyTest.txt"))
  {
   char[] c = new char[1];
   c[0]='w';
   sw.Write (c, 0, 1);
  }


А как же посредством StreamReader, считать один символ с произвольной позиции в файле?

Автор: akaineco 27.1.2005, 02:27
Ну ладно. На самом деле того, что уже есть, мне вполне хватит. Ситуация более или менее прояснилась. FileStream мне больше всего подойдет. Спасибо всем за участие и посильную помощь. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)