Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла 
V
    Опции темы
Katshooter
Дата 29.7.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Не могу разобраться с чтением из файла...
В файле находится строка - каждые 4 байта нужно записать в разные переменные....
Делаю таким образом, но получаю только пустые строки
Код

 OpenFileDialog F = new OpenFileDialog();
            F.ShowDialog();
            FileStream OpenFile = File.Create(F.FileName);
            BinaryReader reader = new BinaryReader(OpenFile);
            byte [] b=new byte[8192];
            int i = reader.Read(b, 0, 4);
            string ccnt = (System.Text.Encoding.Default.GetString(b, 0, i));
            cnt = Convert.ToInt32(ccnt);
            i = reader.Read(b, 4, 4);
            string mmin = System.Text.Encoding.Default.GetString(b, 4, i);
            min=Convert.ToInt32(mmin);
            reader.Close();
            OpenFile.Close();

ХЕЛП)
PM MAIL   Вверх
sentry
Дата 29.7.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: нет
Всего: 10



А так нельзя данные получить:
Код

BinaryReader reader = new BinaryReader(OpenFile);
int i = reader.ReadInt32();

Зачем нужен b?
PM MAIL   Вверх
Katshooter
Дата 29.7.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Потому что так считаеться вся строка сразу, а мне нужно чтоб первые 4 байта ушли в переменную count, вторые 4 байта в переменную min...
В  b я записываю по байтам. а потом из нее считываю в переменные....
Но так не работает smile 
PM MAIL   Вверх
sentry
Дата 29.7.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: нет
Всего: 10



Цитата(Katshooter @  29.7.2007,  13:49 Найти цитируемый пост)
Потому что так считаеться вся строка сразу

Из MSDN:
Цитата

Reads a 4-byte signed integer from the current stream and advances the current position of the stream by four bytes.


Добавлено через 3 минуты и 20 секунд
А если нужно считать определенное кол-во байт, то и это делается проще:
Код

byte[] b = reader.ReadBytes(N); // N - кол-во байт

PM MAIL   Вверх
Katshooter
Дата 29.7.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Если делать так то получаеться ошибка...(Unable to read beyond the end of the stream. )
Код

            BinaryReader reader = new BinaryReader(OpenFile);
            cnt = reader.ReadInt32(); //здесь ошибка выскакиевает(((
            MessageBox.Show(cnt.ToString());

PM MAIL   Вверх
sentry
Дата 29.7.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: нет
Всего: 10



У тебя файл был записан с помощью BinaryWriter? Или нет?
PM MAIL   Вверх
Katshooter
Дата 29.7.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



да, именно  с его помощью.
А если делать так:
Код

           byte [] b = reader.ReadBytes(4);
           cnt = Convert.ToInt32(b);

то при конвертации в int дркгая ошибка:(Unable to cast object of type 'System.Byte[]' to type 'System.IConvertible'.)
PM MAIL   Вверх
stab
Дата 29.7.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 7
Всего: 48



покажи как записываешь.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Katshooter
Дата 29.7.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Код

            SaveFileDialog F = new SaveFileDialog();
            F.ShowDialog();
            FileStream newFile = File.Create(F.FileName);
            BinaryWriter writer = new BinaryWriter(newFile);
            byte b =Convert.ToByte(cnt);
            writer.Write(b);
            writer.Seek(3, SeekOrigin.Current);
            b =Convert.ToByte(min);
            writer.Write(b);
            writer.Seek(3, SeekOrigin.Current);
            b = Convert.ToByte(width);
            writer.Write(b);
            writer.Seek(3, SeekOrigin.Current);
            b = Convert.ToByte(height);
            writer.Write(b);
            writer.Seek(3, SeekOrigin.Current);
            for (int m = 0; m < cnt; m++)
            {
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        b = Convert.ToByte(mas[m][i, j]);
                        writer.Write(b);
                    }
                }
            }
            writer.Close();
            newFile.Close();


 а вообще єто стандарт:

byte    position    C data type     description 
byte    0-3          int                   number of characters in the font 
byte    4-7          int                  value of first character in the font (often 32 for space)  
byte    8-11        int                  pixel width of each character 
byte    12-15       int                   pixel height of each character 
byte    16-          char                 array with character data, one byte per pixel in each character, for a total of (nchars*width*height) bytes.  


Это сообщение отредактировал(а) Katshooter - 29.7.2007, 13:26
PM MAIL   Вверх
stab
Дата 29.7.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 7
Всего: 48



хм.. рекомендую вот это:

Код

byte b =Convert.ToByte(cnt);
writer.Write(b);
writer.Seek(3, SeekOrigin.Current);


заменить на:

Код

writer.Write(cnt);


и читать так:

Код

cnt = reader.ReadInt32();


Добавлено через 1 минуту и 13 секунд
.. или такой экозитческий способ записи неприменно нужен?

Добавлено через 9 минут и 27 секунд
у тебя же в "C data type" все типы указаны, зачем с байтами мучаешся? пиши\читай именно с помощью указанных типов.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Katshooter
Дата 29.7.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



не имеет значения каким образом я записіваю или читаю, главное чтобы работало,

а если делать так как предложено ниже, то опять же появляеться ошибка "Unable to read beyond the end of the stream."
PM MAIL   Вверх
stab
Дата 29.7.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 7
Всего: 48



Код

    public class MyFont
    {
        public int CharCount;
        public int FirstChar;
        public int CharWidth;
        public int CharHeight;
        public byte[][][] Chars;

        public void Write(Stream stream)
        {
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(CharCount);
            writer.Write(FirstChar);
            writer.Write(CharWidth);
            writer.Write(CharHeight);

            for (int c = 0; c < CharCount; c++)
            {
                for (int y = 0; y < CharHeight; y++)
                {
                    writer.Write(Chars[c][y]);
                }
            }
        }

        public void Read(Stream stream)
        {
            BinaryReader reader = new BinaryReader(stream);
            CharCount = reader.ReadInt32();
            FirstChar = reader.ReadInt32();
            CharWidth = reader.ReadInt32();
            CharHeight = reader.ReadInt32();

            Chars = new byte[CharCount][][];
            for (int c = 0; c < CharCount; c++)
            {
                Chars[c] = new byte[CharHeight][];
                for (int y = 0; y < CharHeight; y++)
                {
                    Chars[c][y] = reader.ReadBytes(CharWidth);
                }
            }
        }
    }


Добавлено @ 14:08
ммм.. у тебя похоже записывается колонками, а в моём коде строками. в общем, идея надеюсь понятна. я бы ещё добавил класс MyChar, чтобы отказаться от страшного трёхмерного массива и работать с List<MyChar>, плюс в MyChar сделал бы обычный массив, а не jagged - для скорости полезно smile

Добавлено @ 14:13
Цитата(Katshooter @  29.7.2007,  17:37 Найти цитируемый пост)
не имеет значения каким образом я записіваю или читаю, главное чтобы работало,


твой код как раз таки не работает  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Katshooter
Дата 29.7.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



Ага, не работает эт точно....
Хотела сразу делать на основе Листа, но до класса не додумалась... В панике начала делать в обход, а теперь переделывать слишком много....
Словами про "страшный трехмерный массив" представила лицо моего преподавателя, который заставит все-таки переделывать все с корня(((
Еще изначально сделала массив int, а с Вашей подсказкой переделала его на char и все заработало)))

В очередной раз убедилась что програмистами не становяться, а рождаються!!!(Это о Вас)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.