Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в фаил пеменных разных типов 
:(
    Опции темы
rthsobakas
Дата 27.5.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



Код

int j=19;
fprintf(fp,"%d ",j);

Не скажите как будет выглядеть
если j будет типа Bool,WORD,AnsiString (Вроде %s?)?
PM   Вверх
586
Дата 27.5.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



bool и WORD можно вонвертировать в int.
Для AnsiString использовать метод c_str().
Код
bool b;
WORD w;
int j;
AnsiString s;
//...
fprintf(fp,"%d ",(int)b);
fprintf(fp,"%d ",(int)w);
fprintf(fp,"%d ",j);
fprintf(fp,"%s ",s.c_str());

PM   Вверх
rthsobakas
Дата 27.5.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



586,  а при чтении с фаила b или w обратно конвертировать (bool)b ,  (WORD)w? Можно так?

Это сообщение отредактировал(а) rthsobakas - 27.5.2009, 20:06
PM   Вверх
586
Дата 27.5.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(rthsobakas @  27.5.2009,  21:03 Найти цитируемый пост)
 а при чтении с фаила b или w обратно конвертировать (bool)b ,  (WORD)w? Можно так?

Нет. Если в fscanf написано %d значит должен быть int. Иначе будет скрытая ошибка, котрая может проявится в самый неожиданный момент.
Код
bool b;
WORD w;
int j, temp;
AnsiString s;
char buf[260];
//...
fscanf(fp,"%d",&temp);
b = (temp != 0);
fscanf(fp,"%d",&temp);
w = temp;
fscanf(fp,"%d",&j)
fscanf(fp,"%s",buf);  // unsafe code (опасный код - если длина строки будет >259 символов, будет выход за пределы массива buf)
s = buf;

PM   Вверх
rthsobakas
Дата 27.5.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



ага спасибо
PM   Вверх
586
Дата 27.5.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(586 @  27.5.2009,  21:14 Найти цитируемый пост)
fscanf(fp,"%s",buf);  // unsafe code (опасный код - если длина строки будет >259 символов, будет выход за пределы массива buf)

Так правильнее:
Код
char buf[260];
AnsiString s;

fscanf(fp,"%259s",buf);
s = buf;

PM   Вверх
SVN74
Дата 27.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Вот маленький примерчик, без каких либо конвертаций, (принцип, что поклал, то и взял).
=========================================================================
Код

ЗАПИСЬ В ФАЙЛ:

FILE *f = fopen(InfName.c_str(),"wb");
  if(f==NULL) return false;
   fwrite(&SVR_Folder,sizeof(SVR_Folder),1,f);
   fwrite(&SVR_Folder2,sizeof(SVR_Folder2),1,f);
   fwrite(&SVR_IP,sizeof(SVR_IP),1,f);
   fwrite(&SVR_NIK,sizeof(SVR_NIK),1,f);
   fwrite(&SVR_Port,sizeof(SVR_Port),1,f);
   fwrite(&Inside_Port,sizeof(Inside_Port),1,f);
   fwrite(&SVR_File_Size,sizeof(SVR_File_Size),1,f);
   fwrite(&SVR_File_Sleep,sizeof(SVR_File_Sleep),1,f);
   fwrite(&VideoCompress,sizeof(VideoCompress),1,f);
   fwrite(&Rx,sizeof(Rx),1,f);
   fwrite(&Ry,sizeof(Ry),1,f);
   fwrite(&ClientsFilesCount,sizeof(ClientsFilesCount),1,f);
   fwrite(&MyShareAccept,sizeof(MyShareAccept),1,f);
   fwrite(&AudioX,sizeof(AudioX),1,f);
   fwrite(&AudioY,sizeof(AudioY),1,f);
   fwrite(&VideoX,sizeof(VideoX),1,f);
   fwrite(&VideoY,sizeof(VideoY),1,f);
   fwrite(&AudioCheck,sizeof(AudioCheck),1,f);
   fwrite(&VideoCheck,sizeof(VideoCheck),1,f);
   fwrite(&AutoZapusk,sizeof(AutoZapusk),1,f);  
fclose(f);
------------------------------
ЧТЕНИЕ ИЗ ФАЙЛА:
 FILE *f = fopen(InfName.c_str(),"rb");
  if(f==NULL) return false;
   fread(&SVR_Folder,sizeof(SVR_Folder),1,f);
   fread(&SVR_Folder2,sizeof(SVR_Folder2),1,f);
   fread(&SVR_IP,sizeof(SVR_IP),1,f);
   fread(&SVR_NIK,sizeof(SVR_NIK),1,f);
   fread(&SVR_Port,sizeof(SVR_Port),1,f);
   fread(&Inside_Port,sizeof(Inside_Port),1,f);
   fread(&SVR_File_Size,sizeof(SVR_File_Size),1,f);
   fread(&SVR_File_Sleep,sizeof(SVR_File_Sleep),1,f);
   fread(&VideoCompress,sizeof(VideoCompress),1,f);
   fread(&HorzRes,sizeof(HorzRes),1,f);
   fread(&VertRes,sizeof(VertRes),1,f);
   fread(&ClientsFilesCount,sizeof(ClientsFilesCount),1,f);
   fread(&MyShareAccept,sizeof(MyShareAccept),1,f);
   fread(&AudioX,sizeof(AudioX),1,f);
   fread(&AudioY,sizeof(AudioY),1,f);
   fread(&VideoX,sizeof(VideoX),1,f);
   fread(&VideoY,sizeof(VideoY),1,f);
   fread(&AudioCheck,sizeof(AudioCheck),1,f);
   fread(&VideoCheck,sizeof(VideoCheck),1,f);
   fread(&AutoZapusk,sizeof(AutoZapusk),1,f);
   fclose(f);
---------------------------------
ОТРЫВОК ФОРМАТА ДАННЫХ:
int SVR_Port;
char SVR_IP[40];
char SVR_NIK[80];
int Inside_Port;
char SVR_Folder[256];
char SVR_Folder2[256];
int SVR_File_Size;
int SVR_File_Sleep;
int AudioX, AudioY;
int VideoX, VideoY;
int AudioCheck, VideoCheck;
char AutoZapusk;

char VideoCompress;
char VStat;
char VWindow;
char SWindow;
char SHWindow;
char FWindow;
char SMWindow;
AnsiString InfName;

PM MAIL WWW   Вверх
rthsobakas
Дата 27.5.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



586, а в фпринт тоже писать %259?
и ещё

Код

char buf[260];
AnsiString s;

fscanf(fp,"%259s ",buf);
s = buf;

Может так? я НЕ ПОМНЮ ПОЧЕМУ но там пробел должен быть вроде после s или d. Не помню почему.

Добавлено @ 20:51

Вот я записываю в фаил

Код

  fprintf(fp,"%d ",KolText);
  for (int i = 0; i < KolText; i++) {
   fprintf(fp,"%d %d %d %d %d %d %d %d %s %d %d %d %s %d %d %d ",
   sText[i].X0,sText[i].Y0,
   sText[i].X1,sText[i].Y1,
   (int)sText[i].STYLE.bold,(int)sText[i].STYLE.italic,
   (int)sText[i].STYLE.underline,(int)sText[i].STYLE.strikeout,
   sText[i].NAME.c_str(),sText[i].Height_char,
   sText[i].Width_char,sText[i].COLOR,
   sText[i].TEXT.c_str(),(int)sText[i].REVERS,
   sText[i].POVOROT,(int)sText[i].CHARSET);
   }



А это я считываю
Код

int tmp1,tmp2,tmp3,tmp4,tmp5;
char buf1[260],buf2[260];
int w1,w2;
    fscanf(fp,"%d ",&KolText);
  for (int i = 0; i < KolText; i++) {
   fscanf(fp,"%d %d %d %d %d %d %d %d %259s %d %d %d %259s %d %d %d ",
   &sText[i].X0,&sText[i].Y0,
   &sText[i].X1,&sText[i].Y1,
   &tmp1,&tmp2,
   &tmp3,&tmp4,
   buf1,&sText[i].Height_char,
   &sText[i].Width_char,&w1,
   buf2,&tmp5,
   &sText[i].POVOROT,&w2);

   sText[i].STYLE.bold = (tmp1 != 0);
   sText[i].STYLE.italic = (tmp2 != 0);
   sText[i].STYLE.underline = (tmp3 != 0);
   sText[i].STYLE.strikeout = (tmp4 != 0);
   sText[i].REVERS = (tmp5 != 0);
   sText[i].NAME=buf1;
   sText[i].TEXT=buf2;
   sText[i].COLOR=w1;
   sText[i].CHARSET=w2;
   }

SVN74,  спасибо

Парни , посмотрите плиз, правильно написал?

Это сообщение отредактировал(а) rthsobakas - 27.5.2009, 21:02
PM   Вверх
SVN74
Дата 27.5.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Цитата(rthsobakas @  27.5.2009,  20:41 Найти цитируемый пост)
Парни , посмотрите плиз, правильно написал?

Можно и так, но я когда то сталкнулся с ограничеными возможностями данного варианта (А как быть с __int64, с буферами?)
В моем примере можно вставлять что угодно, структуры, классы и т.д. Да к стати, а почему бы не запихнуть все данные в одну структуру и записать одним махом, можно ли такое сделать используя fprintf - ???

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(rthsobakas @  27.5.2009,  21:41 Найти цитируемый пост)
а в фпринт тоже писать %259?

Нет. В printf может быть любая длина строки.

Цитата(rthsobakas @  27.5.2009,  21:41 Найти цитируемый пост)
fscanf(fp,"%259s ",buf);

Там хоть десять пробелов поставить, они будут игнорироваться. Строка форматирования fscanf немного подругому обрабатывается, чем fprintf.
Ещё, бывали ситуации, когда scanf-функции зависали, при наличии в строке форматирования посторонних символов, например пробелов.
Цитата
посмотрите плиз, правильно написал?

А работает?

Вызывать fprintf можно несколько раз, а то код нереально читать.
PM   Вверх
rthsobakas
Дата 27.5.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



SVN74, так то да.... У тебя намного проще. А че за l?
size_t fwrite(void * ptr, size_t size,size_t n, FILE * stream);
size_t n это что за переменная(о чем)?
586, ща проверю.... Просто если запущу и где то касяк то долго буду искать(и может не найду(тпо из пробела может где то))

спасибо
PM   Вверх
586
Дата 27.5.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(SVN74 @  27.5.2009,  22:06 Найти цитируемый пост)
(А как быть с __int64, с буферами?)

С __int64 в С++ (std::ifstream) нет проблем. С длиной строки тоже.
Буфер можно конвертировать в HEX или base64.
Текстовые файлы просты в отладке. Их можно редактировать в Блокноте.
Использовать бинарный или текстовый режим чтения - зависит от задачи.
PM   Вверх
SVN74
Дата 27.5.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Цитата(rthsobakas @  27.5.2009,  21:15 Найти цитируемый пост)
size_t n это что за переменная(о чем)?

Это указывает количество повторов записи данных, то бишь если поставить 2 - будет дважды записано в файл...
Да, ошибки исключены, если конечно соблюдать порядок чтения и записи разных форматов данных.

PM MAIL WWW   Вверх
dumb
Дата 28.5.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Модератор: Перенесено из Borland C++ Builder
PM MAIL   Вверх
andrew_121
Дата 28.5.2009, 07:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



А почему бы не использовать потоки? smile 
Зачем изобретать велосипед? smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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