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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2017, 22:09   #1
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию Запись в файл

Доброго времени! Перевожу код под билдер с делфи, не могу разобраться как правильно писать в файл, помогите пожалуйста.
Код:
int TForm3::BinaryToByte(const String s){
int i;
   double Result=0;
   for (i=1; i<8; i++){
     Result = Result * 2;}
     if (s[i]=='1') {
 Result++;  }
}

void __fastcall TForm3::Button1Click(TObject *Sender)
{
   String s;
   String fname;
   int i;
   unsigned char b;
  char *ch;
  TFileStream* f;
  TFileStream* f2;

 if(OpenDialog1->Execute()){
fname=OpenDialog1->FileName;
f=new TFileStream(fname,fmOpenRead);
}
if(SaveDialog1->Execute()){

 fname=SaveDialog1->FileName;
 f2=new TFileStream(fname,fmCreate);
 }

  s="";
  for (i=1; i<f->Size; i++){
   f->ReadBuffer( ch, f->Size );
    if ((ch=="0") && (ch=="1")) {
     s = s + ch;
      if (s.Length()==8) {
         b=BinaryToByte(s);

         f2->Write(&b,sizeof(b));
         f2->Free();
         s="";
}  }

}  }
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 06:52   #2
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Вся соль в строке
Код:
f->ReadBuffer( ch, f->Size );
Пишет ошибку Stream read error , не может прочитать в буфер вроде комментируешь её не выскакивает ошибка, но как тогда прочитать? ума не прилажу.
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 07:44   #3
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Сделал так, теперь вроде читает, но выдаёт ошибку что не может записать
Код:
int TForm3::BinaryToByte(const String s){
int i;
   double Result=0;
   for (i=1; i<8; i++){
     Result = Result * 2;}
     if (s[i]=='1') {
 Result++;  }
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
   String s;
   String fname;
   String ffname;
   int i;
String b;
  char *ch;
  TFileStream* f;
  TFileStream* f2;


 if(OpenDialog1->Execute()){
 f=0;
fname=OpenDialog1->FileName;
f=new TFileStream(fname,fmOpenRead);
f->Seek(0,soFromBeginning);
}

if(SaveDialog1->Execute()){
 ffname=SaveDialog1->FileName;
 f2=new TFileStream(ffname,fmCreate);
 f2->Seek(0,soFromBeginning);
 }
  s="";
  for (i=1; i<f->Size; i++){
   f->ReadBuffer( ch, f->Size );
    if ((ch=="0") && (ch=="1")) {
     s = s + ch;
      if (s.Length()==8) {
         b=BinaryToByte(s);

          f2->WriteBuffer(b.data(),b.Length());

         s="";
} }
f->Free();
f2->Free();
 ShowMessage("Готово");

} }
Изображения
Тип файла: jpg Новый точечный рисунок.jpg (99.6 Кб, 132 просмотров)
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 08:40   #4
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Вот вариант на делфи, если это поможет
Код:
function BinaryToByte(const s : string):byte;
var i:integer;

begin
   result := 0;
   for i:=1 to 8 do begin
     result := result * 2;
     if s[i]='1' then Inc(result);

   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var s , fname : string;
   i:integer;
  b  : byte;
  ch : char;
  f  : TFileStream;
  f2 : File of byte;

begin

 if not OpenDialog1.Execute then Exit;
fname:=OpenDialog1.filename;
f:=TFileStream.Create(fname,fmOpenRead);

 if not SaveDialog1.Execute then Exit;
AssignFile(f2, SaveDialog1.FileName);
  Rewrite(f2);

  s:='';
  for i:=1 to f.Size do begin
    f.ReadBuffer(ch,1);
    if (ch='0') or (ch='1') then begin
      s := s + ch;
      if length(s)=8 then begin
         b := BinaryToByte(s);
         BlockWrite(f2, b, 1);
         s := '';
      end;
    end;
  end;
 CloseFile(f2);

 ShowMessage('Готово');

end;
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 09:45   #5
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Вот так ошибок нет выполняется, но файл который я читаю и сохраняю он пустой.
Код:
int TForm3::BinaryToByte(const String s){
int i;
  byte Result=0;
   for (i=1; i<8; i++){
     Result = Result * 2;}
     if (s[i]=='1') {
 Result++;  }
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
   String s;
   String fname;
   String ffname;
   int i;
String b;
  char *ch;
  TFileStream* f;
  TFileStream* f2;


 if(OpenDialog1->Execute()){
fname=OpenDialog1->FileName;
f=new TFileStream(fname,fmOpenRead|fmShareExclusive);
f->Seek(0,soFromBeginning);


if(SaveDialog1->Execute()){
 ffname=SaveDialog1->FileName;
 f2=new TFileStream(ffname,fmCreate);
 f2->Seek(0,soFromBeginning);
 }else {
 f2 = new TFileStream(ffname, fmOpenWrite);
 f2->Seek(0,soFromBeginning);


  s="";
  for (i=1; i<f->Size; i++){
  f->Read( ch, f->Size ); }
 // f->ReadBuffer(ch,f->Size);
    if ((ch=="0") && (ch=="1")) {
     s = s + ch;
      if (s.Length()==8) {
         b=BinaryToByte(s);

        // f2->Write(&b,sizeof(b));
          f2->Write(b.data(),b.Length());

         s="";
} }  }   }

//f->Free();
delete f;
delete f2;
//f2->Free();
 ShowMessage("Готово");


}

Последний раз редактировалось sarsen; 06.01.2017 в 09:54.
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 10:04   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от sarsen Посмотреть сообщение
но как тогда прочитать?
изучать С++ и не делать странную фигню.
char* это указатель (на массив символов, или на 1 символ).

https://ru.wikipedia.org/wiki/%D0%A3...BD%D1%8B%D1%85)

Вы ничего туда не присвоили (если повезло, то он NULL), но пытаетесь записать что-то по этому адресу.

+ зачем-то в цикле пытаетесь читать из файла много буферов равных размеру файла.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.01.2017, 10:31   #7
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
изучать С++ и не делать странную фигню.
char* это указатель (на массив символов, или на 1 символ).

https://ru.wikipedia.org/wiki/%D0%A3...BD%D1%8B%D1%85)

Вы ничего туда не присвоили (если повезло, то он NULL), но пытаетесь записать что-то по этому адресу.

+ зачем-то в цикле пытаетесь читать из файла много буферов равных размеру файла.
Вы меня извините но именно char* присвоен для ch в делфийских сорцах и всё прекрасно работает, от чего же тут не работать именно char* если оно таковым является для....?
sarsen вне форума Ответить с цитированием
Старый 06.01.2017, 10:38   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

char* это не char.

🡳
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
char* это указатель (на массив символов, или на 1 символ).

https://ru.wikipedia.org/wiki/%D0%A3...BD%D1%8B%D1%85)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.01.2017, 13:31   #9
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Вообщем всё поперепробывал, тямы у меня не хватает как получить из 8 символов 0 и 1 получить один байт, в кучку тобиш собрать, соберается но, что то не то на выходе, должно быть $T1 и T2. Вот проектик кому не сложно подмогите, спасибо!
Вложения
Тип файла: rar test.rar (613.6 Кб, 7 просмотров)
sarsen вне форума Ответить с цитированием
Старый 07.01.2017, 09:35   #10
sarsen
Пользователь
 
Регистрация: 04.08.2016
Сообщений: 58
По умолчанию

Пишет но не так как должно, не собирает в 1 байт, как будто берёт только первые 8 бит и гоняет их по кругу, гдето ошибка не могу понять где.
Код:
 byte TForm1::BinaryToByte(const String s){
int i;
 char Result;
   for (i=1; i<8; i++){
     Result = Result * 2;
     if (s[i]=='1')
Result++;
}
 }

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String s,b,fname;
   int i;
  char ch;
  TFileStream* f;
  FILE *f2;


 if(OpenDialog1->Execute()){
fname=OpenDialog1->FileName;
f=new TFileStream(fname,fmOpenRead);


if(SaveDialog1->Execute()){
f2 = fopen(SaveDialog1->FileName.c_str(), "wb");  


  s="";
  for (i=1; i < f->Size; i++){
  f->ReadBuffer(&ch,1);
   if ((ch='0') && (ch='1')) {
   s = s + ch;
      if (s.Length()==8) {
         b=BinaryToByte(s);

       fwrite(&b, sizeof(b), 1, f2);

         s="";
} }  }}  }

delete f;
fclose(f2);

}
sarsen вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в файл CkooTuHa Общие вопросы Delphi 6 29.09.2015 12:57
Запись информации в файл в файл Anubys Win Api 0 04.11.2011 23:27
С++ запись в файл Blondy Помощь студентам 18 13.05.2011 23:00
Запись в файл Evacuator C++ Builder 0 07.05.2011 20:35