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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 17:57   #1
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию Запись структуры в файл

Есть такая труктура,
Код:
typedef struct fini

   {
      char lang[2];
      char serv[30];
      char login[255];
      char pass[255];
   } ini;
Пишу в файл вот так:

Код:
std::fstream f;
f.open("my.bin",std::ios::out|std::ios::binary);
if(!f)return false;
f.write((char *) &ini, sizeof(fini)); 
f.close();
В результате файл пустой, то-ли я туплю то-ли что-то в коде...

Последний раз редактировалось Error_kpi; 28.12.2010 в 18:00.
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 18:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

а где поля ini заполняются?
Да и потом ты объявил тип:
Код:
typedef struct fini
А не переменную. Убери слово typedef или создай такого типа переменную.
I'm learning to live...

Последний раз редактировалось Stilet; 28.12.2010 в 18:07.
Stilet вне форума Ответить с цитированием
Старый 28.12.2010, 18:28   #3
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию

Код:
struct fini ini;
- обьявление переменной ини

вот заполнение полей:
Код:
memcpy(inif.lang,"RU",sizeof(char)*2);
memcpy(inif.serv,"some serv",sizeof(char)*9);
memcpy(inif.login,"some login",sizeof(char)*10);
memcpy(inif.pass,"some pass",sizeof(char)*10);
а вообще даже этот иф выкидывает сразу:
Код:
if(!f)return false;
также пробовал закоментировать строку с проверкой - файл пустой (но ошибку открытия или файл не найден не выдает)

да насчет одинаковых названий: ini - пробовал применять переменную с другим именем, толку 0 - файл пустой!!

Кстати еще один интересный момент:
Первый элемент структуры после заполнения, почему-то равен:
Код:
inif.lang="RUsome serv"
???

Последний раз редактировалось Error_kpi; 28.12.2010 в 18:34.
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 18:35   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

1) у тебя 2 типа fini и ini

объявляй так

struct fini
{
char lang[2];
char serv[30];
char login[255];
char pass[255];
} ini;

тогда будет тип fini и переменная ini типа fini

2) запусти отладчик и посмотри идет ли запись вобще

3) про интересный момент - у тебя данные в структуре идут подряд в памяти: char lang[2], char serv[30];
а так как ты не ставишь после lang символ конца строки (0) то у тебя строки и слипаюцо

Последний раз редактировалось UltimaBeaR; 28.12.2010 в 18:38.
UltimaBeaR вне форума Ответить с цитированием
Старый 28.12.2010, 18:42   #5
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию

1) пробовал и так и так результат тотже.
2) нет запись не идет. (так как файл не открывается - проверка не срабатывает)
3) понял учту спасибо.
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 18:48   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Все у тебя работает:
Код:
// dfgdfgdfg.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <fstream>
typedef struct fini

   {
      char lang[2];
      char serv[30];
      char login[255];
      char pass[255];
   } ini;


int _tmain(int argc, _TCHAR* argv[])
{

fini ini;
memcpy(ini.lang,"RU",sizeof(char)*2);
memcpy(ini.serv,"some serv",sizeof(char)*9);
memcpy(ini.login,"some login",sizeof(char)*10);
memcpy(ini.pass,"some pass",sizeof(char)*10);

	
std::fstream f;
f.open("my.bin",std::ios::out|std::ios::binary);
if(!f)return false;
f.write((char *) &ini, sizeof(fini)); 
f.close();

	return 0;
}
Файл создается - 542 байта в нем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.12.2010, 18:54   #7
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию

действительно работает. Видать дето напартачил с областью видимости переменных. Буду тестить. Всем спасибо.

#л# я даже знаю где я напартачил наверное......

Последний раз редактировалось Error_kpi; 28.12.2010 в 19:08.
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 19:06   #8
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
Подмигивание

собственно код поправил - все работает, хотя странное что-то было:
Все это дело происходило в классе:

Код:
typedef struct fini

   {
      char lang[3];
      char serv[30];
      char login[255];
	  char pass[255];
   } ini; 

class CIniFile
{
	const char* FName;
        std::fstream f;
public:
	fini inif;
	CIniFile();
	~CIniFile();
	bool Open(const char* m_FName);
	bool Read();
	bool Write();	
        void Close();
};
ну реализацию функции записи вы видели:

Код:
f.open("my.bin",std::ios::out|std::ios::binary);
if(!f)return false;
f.write((char *) &inif, sizeof(fini)); 
f.close();
return true;
удалил объявление файла из класса и вставил его в функцию:

Код:
bool CIniFile::Write()
{
	std::fstream f;
	f.open(FName,std::ios::out|std::ios::binary);
	if(!f)return false;
	f.write((char *) &inif, sizeof(fini)); 
	f.close();

	return true;
}
Все заработало. Хз что это за приколы такие были.... есть подозрение что нужно было объявить файл как public: хотя так даже лутше получилось.
Всем спасибо !! план хороший
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 20:03   #9
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Глюков от того что оно сидит как поле класса быть не должно, неважно public или нет. Возможно ты его в каком то другом методе юзаешь(открываешь например) перед выполнением этого кода вот он и не хочет открыватся так как уже открыт. Посмотри может какие-то нехорошие вещи у тебя в конструкторе делаются и из-за этого последствия.
UltimaBeaR вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами Nice Plant Помощь студентам 1 21.11.2010 05:45
работа с файлами 4thWing Общие вопросы C/C++ 5 12.04.2010 01:04
работа с файлами Анюта01 Фриланс 8 19.03.2010 22:41
Работа с файлами в С++ xnise Помощь студентам 4 15.03.2010 21:29
работа с файлами smb. Помощь студентам 4 26.03.2009 17:06