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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2010, 19:52   #1
iLLUMIN
 
Регистрация: 22.11.2009
Сообщений: 4
По умолчанию Записать структуру в файл

Записать структуру в файл на сях.
Имеется некая структура
Код:
typedef struct some{
   int one,two,ten;
   char *q;
}lol;
Переменная ей принадлежащая
Код:
lol variable;
Могу ли я записать variable в файл целиком
Код:
fprintf(f,"%wtf?!",variable);
Или же мне придется писать все по отдельности
Код:
fprintf(f,"%d %d %d %s", variable.one... etc
?
iLLUMIN вне форума Ответить с цитированием
Старый 28.02.2010, 20:25   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
lol var;
fwrite(&var, sizeof(var), 1, f);
.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.02.2010, 20:36   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

2 pproger
Так запишется указатель на строку, а не сама она.

Код:
fprintf(f,"%d %d %d %s", variable.one... etc
Более лучший вариант.
p51x вне форума Ответить с цитированием
Старый 28.02.2010, 20:43   #4
iLLUMIN
 
Регистрация: 22.11.2009
Сообщений: 4
По умолчанию

p51x, у меня over 10 переменных в структуре, паревно, хотя, похоже, придется делать так.
pproger, при подходе к кульминационному моменту вылетает с Segmentation fault. (файл открывал с "wb")
Код:
FILE * q;
q = fopen("1", "bw");
fwrite(&var,sizeof(var),1,q);

Последний раз редактировалось iLLUMIN; 28.02.2010 в 20:46.
iLLUMIN вне форума Ответить с цитированием
Старый 28.02.2010, 21:33   #5
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от iLLUMIN Посмотреть сообщение
p51x, у меня over 10 переменных в структуре, паревно, хотя, похоже, придется делать так.
pproger, при подходе к кульминационному моменту вылетает с Segmentation fault. (файл открывал с "wb")
Код:
FILE * q;
q = fopen("1", "bw");
fwrite(&var,sizeof(var),1,q);
у вас написано не wb а bw тэто во превых. во вторых
данный способ неверен, т.к. sizeof(char*) будет равен одному, запишуться one,two,ten и один байт из q. Если в структуре есть указатели то надо записывать следующим образом

Код:
fwrite(&var.one,sizeof(int),1,f);
fwrite(&var.two,sizeof(int),1,f);
fwrite(&var.ten,sizeof(int),1,f);
fwrite((void*)var.q,strlen(var.q),1,f);
подпись
liljon вне форума Ответить с цитированием
Старый 28.02.2010, 22:01   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ну... не одному, а 4, скорее всего... все-таки указатель.
p51x вне форума Ответить с цитированием
Старый 28.02.2010, 23:08   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2p51x
Цитата:
2 pproger
Так запишется указатель на строку, а не сама она.
я передаю указатель на структуру, а не на строку + размер структуры.

2iLLUMIN
Код:
#include <stdio.h>
#include <string.h>

typedef struct _tagStruct {
	int a;
	int b;
	char name[64];
} st;

int main()
{
	st s;
	FILE* f;

	s.a = 1;
	s.b = 2;
	strcpy(s.name, "myname");

	f = fopen("./file", "w");
	fwrite(&s, sizeof(s), 1, f);
	fclose(f);

	memset(&s, 0, sizeof(s));

	f = fopen("./file", "r");
	fread(&s, sizeof(s), 1, f);
	fclose(f);

	printf("%d %d %s\n", s.a, s.b, s.name);

	return 0;
}

пс. ту емое

Код:
typedef struct some{
   int one,two,ten;
   char *q;
}lol;
нельзя просто так записать целиком структуру. действительно, по одному полю, либо убери указатель из структуры
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 28.02.2010 в 23:11.
pproger вне форума Ответить с цитированием
Старый 28.02.2010, 23:16   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
fwrite(&s, sizeof(s), 1, f);
fread(&s, sizeof(s), 1, f);
и что это такое? в файл запишется фиг знает что, но не 1 2 myname

может быть всё-таки так будет правильно
Код:
fprintf(f,"%d %d %s",s.a,s.b,s.name);
fscanf(f,"%d%d%s",&s.a, &s.b, &s.name);
NiCola999 вне форума Ответить с цитированием
Старый 28.02.2010, 23:21   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2NiCola999
Цитата:
и что это такое? в файл запишется фиг знает что, но не 1 2 myname
в моем случае в файл запишется память структуры, которую потом можно считать в такую же структуру
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.02.2010, 23:40   #10
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

в файл запишеться как раз что надо.
00 00 00 01 | 00 00 00 02 | 6D 79 6E 61 6D 65

в том дело, что int 4 байта, посчитайте выше. откройте редактором и сами увидете как отображаеться код аски символа 0x01 и 0x02 (это то, что для вас не так. Зависит от поставленой задачи! Если вам надо чтобы отображался текст - делайте как выше написали вы.
Тогда считывайте так
Код:
fscanf(f,"%d%d%s",&s.a, &s.b, s.name);
Без амперсанта перед s.name

и уберите пробелы
Код:
fprintf(f,"%d%d%s",s.a,s.b,s.name);
во втором параметре, либо поставте их в fscanf
подпись

Последний раз редактировалось liljon; 28.02.2010 в 23:43.
liljon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пожалуйста, помогите записать в файл... tirael666 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 21.12.2009 21:06
бинарное дерево записать в файл. lubafffka Общие вопросы C/C++ 4 06.05.2009 15:47
бинарное дерево записать в файл lubafffka Помощь студентам 1 05.05.2009 19:22
Как записать файл в файл программы? Хамяг Общие вопросы Delphi 2 02.11.2008 16:01
записать байт файл мандарин Общие вопросы Delphi 8 09.05.2007 20:45