Консультация № 171606
25.08.2009, 18:44
0.00 руб.
26.08.2009, 06:53
0 19 2
Здравствуйте!
У меня такой вопрос: а возможно ли в C# считывать/записывать файлы в бинарном режиме с определенной позиции побайтно? Например, в VB6 это выглядит так: Get #F,1000,A
Т.е. мы в переменную А считываем байт номер которого 1000. F - переменная, идентифицирующая файл. Использую MS Visual Studio 2008.
Спасибо!

Обсуждение

Неизвестный
25.08.2009, 19:14
общий
это ответ
Здравствуйте, AkaProc.

Конечно можно, но в 2 шага:

FS.Position = 1000;
I = FS.ReadByte();

Приложение:
int I;
byte B=0;
FileStream FS = new FileStream(@"D:\File", FileMode.Open, FileAccess.Read);
FS.Position = 1000;
I = FS.ReadByte();
if (I != -1)
B = (byte)I;
else
{
///Конец файла
}
FS.Close();
5
Не знаю, как Вас благодарить!! :)
давно
Старший Модератор
17042
808
26.08.2009, 06:54
общий
AkaProc:
Прошу обратить внимание, что C# и C++ - это разные языки программирования.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
27.08.2009, 20:53
общий
Я тут решил составить код для записи, делал по аналогии. Посмотрите, пожалуйста, правильно ли ? Вот код:
byte I = 0;
byte B = 0;
FileStream FS = new FileStream(@"D:\File", FileMode.Open, FileAccess.Write);
FS.Position = 10;
FS.WriteByte(I);
if (I != -1)
{
//B = (byte)I;
//ChatText.Text = I.ToString();
}
else
{
///Конец файла
}
FS.Close();
Ошибок не выдает... но по-моему ничего не происходит...
Спасибо.
Неизвестный
27.08.2009, 21:33
общий
Если такого файла нет еще, должно выдать исключение. OpenOrCreate создает несуществующий файл.
Неизвестный
27.08.2009, 21:37
общий
У меня файл получился длиной 11 байт. Все нули.
if тут бесполезен. Это была проверка на конец файла при чтении.
Неизвестный
28.08.2009, 10:01
общий
Как я понял, что если при чтении I=-1, то это означает конец файла, так?
Неизвестный
28.08.2009, 11:33
общий
Если читать блок, метод возвращает количество прочитанных байт. Если их 0, значит файл прочитан до конца.
При чтении байта метод возвращает одно значение. Чтобы распознать конец файла - передается инт, а не байт. И отсутствие байта отмечается как -1 (FFFFFFFF)
Так в любой современной ОС принято (переняли из С).

Если заранее известен размер файла, обычно с проверками не заморачиваются - просто читают в цикле. Хотя есть риск, что файл за это время уменьшится или увеличится.
Неизвестный
28.08.2009, 19:32
общий
Ээээ......мммм.... не понял немного.Тут есть оператор для считывания блоками?
Неизвестный
29.08.2009, 01:40
общий
Оператора такого нет. В С# очень мало операторов. Есть стандартный метод Read или Write у каждого потока (Stream).
FileStream FS=new FileStream("d:\\File".....)
FS.Read(Array, Offset, Count);
Ему дается массив, начальный индекс в массиве и количество байт. Обычно вызывают так: FS.Read(Arr, 0, Arr.length);
Так записывается или считывается кусок массива в любой файл, отправляется по сети и т.д.
Offset - это начальная позиция не в файле, а в массиве!
Неизвестный
29.08.2009, 10:56
общий
Спасибо, покачто больше вопросов нет.
Неизвестный
30.08.2009, 14:15
общий
это ответ
Здравствуйте, AkaProc.
Для чтения и записи бинарных потоков можно использовать классы BinaryReader/BinaryWriter, обладающих множеством перегрузок для методов чтения/записи, позволяющими работать с различными типами данных.
Код:

using System;
using System.IO;

namespace Test_CS
{
class Program
{
const string fileName = @"E:\file.bin";

static void Main(string[] args)
{
try
{
using (FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
using (BinaryReader binReader = new BinaryReader(fileStream))
using (BinaryWriter binWriter = new BinaryWriter(fileStream))
{
// Пишем в поток
binWriter.Write(true);
binWriter.Write("Строка");
binWriter.Write(2.5);
binWriter.Write((byte)255);
// Указатель на начало
fileStream.Seek(0, SeekOrigin.Begin);
// Читаем и выводим
Console.WriteLine("Bool:{0}\nString:{1}\nDouble:{2}\nByte:{3}",
binReader.ReadBoolean(), binReader.ReadString(), binReader.ReadDouble(), binReader.ReadByte());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}
}
}

Результат:
Код:

Bool:True
String:Строка
Double:2,5
Byte:255
5
Спасибо!
Неизвестный
03.09.2009, 21:44
общий
Если можно, у меня такой вопрос: как можно записать бинарные данные, содержищиеся в строковой переменной в файл?
Неизвестный
03.09.2009, 22:00
общий
AkaProc:
бинарные данные, содержищиеся в строковой переменной

Что это такое?
Неизвестный
03.09.2009, 22:01
общий
AkaProc:
В каком смысле "бинарные"? Если просто строка должна быть записана в поток, есть классы StreamWriter и BinaryWriter
Неизвестный
03.09.2009, 22:49
общий
Дело вот, в чем: у меня идет передача файла (с клиента на сервер) клиент считывает несколько байт и отправляет их на сервер. На сервер приходит строка, а не число, т.е. это эти данные, только в виде строки. Это при условии, что я отправляю бинарные данные из файла, т.е. числа. Приходят данные, естесственно, в строковую переменную. Вот и вопрос: а как записать строку в файл, ведь это не числа как таковые. Преобразовывать с помощью циклов, я считаю, не вариант - уж очень ресурсоемко и мутерно.Мб, StreamWriter поможет...
Неизвестный
04.09.2009, 00:00
общий
AkaProc:
Все равно не понятно. Байты из файла преобразуются из чисел в строчку и это пересылается по сети? Тогда кроме StreamWriter надо еще использовать методы byte.ToString и byte.Parse. Только неясно зачем это. Блок из файла просто пересылается по сети без преобразований. А это надо обрабатывать и передавать больший объем.
Неизвестный
04.09.2009, 19:51
общий
На самом деле байты не преобразуются в строку отправителем, они преобразуются в строку получателем. Так, вот и вопрос: как записать бинарные данные из строки в файл. В VB6 получалось просто с помощью обычного оператора Put, который мог писать данные как из числовых переменных, так и из строчных. Может быть, и тут так можно...
Неизвестный
05.09.2009, 04:46
общий
AkaProc:
Put вроде берет строчку и записывает каждый ее символ байтом в файл. Это наоборот текстовые данные, а не бинарные. StreamWriter и BinaryWriter могут посылать в поток строку. Можно еще кодировку у этого класса подкрутить - 1,2,4 байта на символ и локаль. BinaryWriter, вроде, более универсальный.
BW.WriteString(S) = put BW, , S
Если я с названиями не накосячил
Неизвестный
06.09.2009, 13:17
общий
Спасибо! Буду проводить эксперименты...
Форма ответа