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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с записью/чтением рус. символов 
:(
    Опции темы
4epT
Дата 9.10.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый вечер!

Вот таким образом записываю в файл информацию:

Код

        public static void writeInfo(String path, String info)
        {
            FileStream file = new FileStream(path, FileMode.Append);
            for (int i = 0; i < info.Length; i++)
            {
                char c = info[i];
                file.WriteByte((byte)c);
            }
            file.Close();
        }


Вот так считываю:

Код

        public static String getInfoStartCount(int astart, int acount,String path)
        {
            String info = "";
            FileStream file = new FileStream(path, FileMode.Open);
            for (int i = 0; i < (acount + astart) - 1; i++)
            {
                if (i >= astart - 1 && astart != 0)
                {
                    char c;
                    int k = file.ReadByte();
                    c = (char)k;
                    info += c.ToString();
                }
                else
                {
                    file.ReadByte();
                }
            }
            file.Close();
            return info;
        }


Все нормально работает ... но если записывать русские символы в файл, то оно записывает черт знает что ... ((( следовательно считует тоже непонятно что ((( насколько я понял то проблема с кодировкой ... как это исправить ?? smile 

Заранее спасибо! 
PM MAIL   Вверх
QryStaL
Дата 9.10.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Код

public static void writeInfo(String path, String info)
{
    using (StreamWriter sw = new StreamWriter(path, true))
    {
        sw.Write(info);
    }
}


Считывать аналогично с помощью класса StreamReader


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
4epT
Дата 9.10.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну мне не совсем это нужно ((( мне нужно использовать именно WriteByte для побайтовой записи ... потому что для каждого файла информация хранится в одном файле ... и считую только конкретные байты для текущего файла ...


Ну или подскажите пожалуйста как с помощью класса StreamReader считать конкретные байты ?
У меня хранится значение start (с какого байта начинается) и count (колличество байт с заданной позиции)

Это сообщение отредактировал(а) 4epT - 9.10.2008, 22:58
PM MAIL   Вверх
QryStaL
Дата 9.10.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Не совсем понял, ну да ладно

Код

public static void writeInfo(String path, String info)
{
    using (FileStream file = new FileStream(path, FileMode.Append))
    {
        byte[] b = Encoding.Default.GetBytes(info);
        for (int i = 0; i < b.Length; i++)
        {
            file.WriteByte(b[i]);
        }
    }
}


Типа такого?


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
4epT
Дата 9.10.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(QryStaL @ 9.10.2008,  23:04)
Не совсем понял, ну да ладно

Код

public static void writeInfo(String path, String info)
{
    using (FileStream file = new FileStream(path, FileMode.Append))
    {
        byte[] b = Encoding.Default.GetBytes(info);
        for (int i = 0; i < b.Length; i++)
        {
            file.WriteByte(b[i]);
        }
    }
}


Типа такого?

ну вот этот код не работает ((


а вот этот:

Код

public static void writeInfo(String path, String info)
{
    using (StreamWriter sw = new StreamWriter(path, true))
    {
        sw.Write(info);
    }
}


работает хорошо ... только что - то не пойму как  мне потом считать информацию с файла (считать нужно конкретные байты) ... как - то можно считать с помощью класса StreamWriter например - 10 байт начиная с 5 байта ?

Это сообщение отредактировал(а) 4epT - 9.10.2008, 23:14
PM MAIL   Вверх
mihryak
Дата 9.10.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



один символ вовсе не обязательно представляется одним байтом!
байты для записи получай с помощью нужной тебе кодировки через метод GetBytes

не видел поста QryStaL

проблема явно в кодировке, StreamReader умеет её определять по BOM, тебе же придётся её явно задавать

Это сообщение отредактировал(а) mihryak - 9.10.2008, 23:20
PM MAIL ICQ   Вверх
QryStaL
Дата 9.10.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Цитата(4epT @  9.10.2008,  23:14 Найти цитируемый пост)
ну вот этот код не работает ((

этот код как пример, я использовал юникодную кодировку по-умолчанию, тебе же нужно использовать свою 

byte[] b = Encoding.[кодировка].GetBytes(info);


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
mihryak
Дата 9.10.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



запутался с reader'ами-writer'ами в предыдущем сообщении

автору рекомендую ещё раз задуматься о нефиксированном размере одного символа
читать и писать посимвольно позволяют классы StreamReader/StreamWriter, чтение/запись также могут осуществляться блоками

Это сообщение отредактировал(а) mihryak - 9.10.2008, 23:34
PM MAIL ICQ   Вверх
4epT
Дата 9.10.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо всем за помощь! Пока что еще не разобрался с поблемой ... но уже что-то начинает прояснятся )
Юзаю классы StreamReader/StreamWriter ...

Добавлено через 14 минут и 34 секунды
Проблема практически решена ...

Мой файл:

Код

Попытка записать рус символы123123123123123 Русский English


Как из этого файла считать только вот эти символы с помощью класса StreamReader - "123123123123123 Русский English"  ?

Пытаюсь считать вот так :
Код

            char[] buff = new char[astart + acount + 1]; 
            StreamReader sw = new StreamReader(path, true);
            sw.ReadBlock(buff, astart, acount);
            String info = "";
            for (int i = 1; i < buff.Length - 1; i++)
            {
                info += buff[i].ToString();
            }


astart - индекс с какого символа начать считывать
acount - кол-во символов

Если я что то не понимаю, то просьба объяснить номральным языком )

PM MAIL   Вверх
MasterOfCode
Дата 10.10.2008, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Код

            string[] s = File.ReadAllLines(path, Encoding.GetEncoding(1251));
            foreach (string line in s)
            {
                Console.WriteLine(line.Substring(line.IndexOf('1')));
            }

Можно например без потоков работать. smile


--------------------
user posted image
PM ICQ   Вверх
mihryak
Дата 10.10.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



Код

        static void Main(string[] args)
        {
            string value = "Попытка записать рус символы123123123123123 Русский English";

            using (StreamWriter writer = new StreamWriter(@"c:\test.txt"))
            {
                writer.Write(value);
            }

            using (StreamReader reader = new StreamReader(@"c:\test.txt"))
            {
                int skipBlockLength = value.IndexOf("12");
                char[] skipBlockChars = new char[skipBlockLength];
                reader.ReadBlock(skipBlockChars, 0, skipBlockLength);

                int requiredBlockLength = value.Length - skipBlockLength;
                char[] requiredBlockChars = new char[requiredBlockLength];
                reader.ReadBlock(requiredBlockChars, 0, requiredBlockLength);

                string subString = new string(requiredBlockChars);
                Console.WriteLine(subString);
            }
        }


ты неправильно используешь ReadBlock, второй параметр - index - отвечает не за стартовую позицию в потоке, а за индекс в массиве символов, с которого надо заполнять его прочитанными символами
так что сначала необходимо вычитать все предыдущие символы из потока, чтобы добраться до нужных
PM MAIL ICQ   Вверх
4epT
Дата 10.10.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mihryak, проблема в том что я заранее не знаю что у меня в файле находится .... я знаю только индекс с какого элемента мне нужно начать считывать и сколько символов ....
PM MAIL   Вверх
mihryak
Дата 10.10.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



4epT, если индекс - это номер символа, то проблемы нет
выделяй "мусорный" буфер длиной в это кол-во, считывай его, забывай про него, читай нужный блок
если он предположительно приличного размера, то перед прочтением нужного блока в цикле вызывай reader.Read() нужное кол-во раз
PM MAIL ICQ   Вверх
4epT
Дата 10.10.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mihryak @ 10.10.2008,  15:32)
4epT, если индекс - это номер символа, то проблемы нет
выделяй "мусорный" буфер длиной в это кол-во, считывай его, забывай про него, читай нужный блок
если он предположительно приличного размера, то перед прочтением нужного блока в цикле вызывай reader.Read() нужное кол-во раз

Спасибо! Так и сделал )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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