Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 22:38   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию аналог StreamReader, без буферизации.

сабж в теме.

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

или придется писать свой аналог?(мне не трудно, но может есть готовое)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2011, 00:43   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Коллега, а можете на примере продемонстрировать:
"он скачивает часть данных, но обратно её не возвращает, в итоге эта часть теряется" ?!

что и куда теряется?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.03.2011, 00:54   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

пример банален, мне нужно с файла считать данные до пустой строки, дальнейшие данные это бинарные данные их нужно обработать иначе.

получается так:
Код:
FileStream fs=new FileStream(@"C:\1.bin",FileMode.Open,FileAccess.Read);
StreamReader sr=new StreamReader(fs);
string s;
while((s=sr.ReadLine())=="")
{
    //чтото делаю со строкой
}
FileStream fs2=new FileStream(@"C:\2.bin",FileMode.Create,FileAccess.Write);
fs.CopyTo(fs2);
в итоге в файле 2.bin оказываются не все данные после пустой строки файла 1.bin
то есть StreamReader буферизирует данные, это мне мешает, минимум мне удавалось снизить потери до 0,10КБ
используя
Код:
new StreamReader(fs,1);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2011, 12:45   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а что мешает и писать данные кусками?
soleil@mmc вне форума Ответить с цитированием
Старый 09.03.2011, 12:48   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может я чего то не понимаю, но как я могу так сделать, ведь мне не известен заранее размер куска, поэтому кусок так или иначе попадет нетуда, и причем разрезания строк допустить нельзя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2011, 12:58   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

может я пока слабо понимаю в шарповом коде
но ты лучше напиши что ты конкретно хочешь получить из 1го файла во 2й?
а то обычно код делает одно, а программер подразумевал другое, но проге же не прикажешь - делает что написано
soleil@mmc вне форума Ответить с цитированием
Старый 09.03.2011, 13:03   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

код делает почти то что мне надо, но он теряет данные за счет буферизации StreamReader.

файл имеет вид
Код:
строка 
строка 
строка

<бинарные данные>
мне нужно считать строки до пустой, и потом уже получить бинарные данные, потери и того и того неприемлимы.
заранее неизвестен ни размер бинарных данных, ни размер блока с текстом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2011, 13:46   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну если ты умеешь находить положение блока с бинарными данными, то какие сложности прочитать поток с определенной позиции и до конца?

вот полез в доку, прочитал, дописал по твоему примеру и опробовал
Код:
using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        try 
        {            
            FileStream fs = new FileStream("1.bin",FileMode.Open,FileAccess.Read);

        	using (StreamReader sr = new StreamReader("1.bin"))
            {
                string line;
                bool flag = false;
                using (StreamWriter wr = File.CreateText("2.bin"))
                while ((line = sr.ReadLine()) != null) 
                	{
                    	Console.WriteLine(line);
                    	if (line == "") {flag = true;}
                    	if (flag == true) 
                    		{
	                    	line = sr.ReadToEnd();
                    		wr.WriteLine(line);
                    		}
                	}
            }            
        }
        catch (Exception e) 
        {            
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
        Console.ReadKey();
    }
}
З.Ы.: не знаю как более элегантно там работают ифы, но пример рабочий
soleil@mmc вне форума Ответить с цитированием
Старый 09.03.2011, 14:02   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну и код можно немного упростить
убрать этот флаг

Код:
              while ((line = sr.ReadLine()) != null) 
                	{
                    	Console.WriteLine(line);
                    	if (line == "") {
	                    	line = sr.ReadToEnd();
                    		wr.WriteLine(line);
                    		}
                	}
soleil@mmc вне форума Ответить с цитированием
Старый 09.03.2011, 18:29   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хм вариант хороший спасибо, но он не подойдет для этой цели(но сохраню, в другой скорее всего пригодится)
Код:
fs.CopyTo(fs2);
подобный вызов все равно нужен будет, то есть мне нужно будет работать с самим потоком данных.
или же создать временный файл/MemoryStream?

но чем мне так не нравится

ЗЫ: настоящий код естественно сложнее, но структура та же, то есть после чтения текста, мне нужен сам именно Stream.

неужель нет готового класса?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.03.2011 в 18:33.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
<b>Осуществление ввода с клавиатуры без последующего подтверждения(без ENTER)</b> khorolpavel Общие вопросы C/C++ 2 30.12.2010 12:04
Использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Win Api 1 05.04.2010 20:08
Win Api: использование метода двойной буферизации для динамической графики(избавление от мерцания) noxin Помощь студентам 0 05.04.2010 19:55
Аналог try. beemoto Общие вопросы Delphi 16 16.12.2009 18:33
Процедуры без Bios и без Dos,бывают? codeok Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 31.10.2008 03:17