Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с бинарными файлами в c++ / 25 сообщений из 27, страница 1 из 2
04.12.2012, 16:39
    #38064632
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
помогите пожалуйста, что то целый день читаю про работу с файлами и никак не могу понять как работать с бинарными файлами
суть задания такая

консольное приложение с++ win 32.
Надо записать 4 переменные в бинарный файл и считать их потом оттуда, как не пробую, считывается не то что записываю.
для примера вот 4 переменные:

char* name = "Motorbike";
char* color = "Blue";
int speed =155;
float power = 3.3;
...
Рейтинг: 0 / 0
04.12.2012, 16:40
    #38064637
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Лучше покажи как пишешь
...
Рейтинг: 0 / 0
04.12.2012, 16:46
    #38064659
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
ofstream outfile("c:\\test.bin", ios::binary);
if (!outfile)
{
cout<<"error1"<<endl;
_getch();
return 1;
}
char* name = "Motorbike";
char* color = "Blue";

int l = strlen(name);
outfile.write(reinterpret_cast<char *>(&l), 1);

int c = strlen(color);
outfile.write(reinterpret_cast<char *>(&c), 1);

outfile.write(reinterpret_cast<char *>(&name), sizeof(name));

outfile.write(reinterpret_cast<char *>(&color), sizeof(color));

int speed = 1525;
outfile.write(reinterpret_cast<char *>(&speed), sizeof(double));

float power = 331.3;
outfile.write(reinterpret_cast<char *>(&power), sizeof(float));

outfile.close();


ifstream infile("c:\\test.bin", ios::binary);
if (!infile)
{
cout<<"error2"<<endl;
_getch();
return 2;
}
int l_r;
int c_r;

int x;
int speed_r;
float power_r;

infile.read(reinterpret_cast<char *>(&l_r), 1);
char *name_r = new char[l_r];
infile.read(reinterpret_cast<char *>(&c_r), 1);
char *color_r= new char[c_r];
infile.read(reinterpret_cast<char*>(&name_r), sizeof(name_r));
infile.read(reinterpret_cast<char*>(&color_r), sizeof(color_r));
infile.read(reinterpret_cast<char*>(&speed_r), sizeof(speed_r));
infile.read(reinterpret_cast<char*>(&power_r), sizeof(power_r));

infile.close();
cout << name_r << ' '<<color_r<<' '<<speed_r<<' '<<power_r<<' ';


З.Ы. на си шарп давно писал, на с++ еще давнее, после си шарп вообще с++ перестал понимать......
...
Рейтинг: 0 / 0
04.12.2012, 17:05
    #38064715
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rn, оформляйте исходники с использованием
тега [src]
...
Рейтинг: 0 / 0
04.12.2012, 17:39
    #38064793
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Код: plaintext
1.
2.
int speed = 1525;
outfile.write(reinterpret_cast<char *>(&speed), sizeof(double));


Что ты пытаешься записать этим кодом?
...
Рейтинг: 0 / 0
04.12.2012, 17:45
    #38064804
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
daunito,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
 
ofstream outfile("c:\\test.bin", ios::binary);
 if (!outfile)
 {
 cout<<"error1"<<endl;
 _getch();
 return 1;
 }
 char* name = "Motorbike";
 char* color = "Blue";

 int l = strlen(name);
 outfile.write(reinterpret_cast<char *>(&l), 1);

 int c = strlen(color);
 outfile.write(reinterpret_cast<char *>(&c), 1);

 outfile.write(reinterpret_cast<char *>(&name), sizeof(name));
 
outfile.write(reinterpret_cast<char *>(&color), sizeof(color));

 int speed = 1525;
 outfile.write(reinterpret_cast<char *>(&speed), sizeof(int));

 float power = 331.3;
 outfile.write(reinterpret_cast<char *>(&power), sizeof(float));

 outfile.close();
 

ifstream infile("c:\\test.bin", ios::binary);
 if (!infile)
 {
 cout<<"error2"<<endl;
 _getch();
 return 2;
 }
 int l_r;
 int c_r;
 
int x;
 int speed_r;
 float power_r;

 infile.read(reinterpret_cast<char *>(&l_r), 1);
 char *name_r = new char[l_r];
 infile.read(reinterpret_cast<char *>(&c_r), 1);
 char *color_r= new char[c_r];
 infile.read(reinterpret_cast<char*>(&name_r), sizeof(name_r));
 infile.read(reinterpret_cast<char*>(&color_r), sizeof(color_r));
 infile.read(reinterpret_cast<char*>(&speed_r), sizeof(speed_r));
 infile.read(reinterpret_cast<char*>(&power_r), sizeof(power_r));
 
infile.close();
 cout << name_r << ' '<<color_r<<' '<<speed_r<<' '<<power_r<<' ';
...
Рейтинг: 0 / 0
04.12.2012, 17:45
    #38064805
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
daunito
Код: plaintext
1.
2.
int speed = 1525;
outfile.write(reinterpret_cast<char *>(&speed), sizeof(double));


Что ты пытаешься записать этим кодом?

исправил дабл на инт, если вы это имели ввиду.
...
Рейтинг: 0 / 0
04.12.2012, 18:05
    #38064835
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rn,

ну а в чем проблема-то? Покажи что в файле. Вообще пишется туда что-нибудь?
...
Рейтинг: 0 / 0
04.12.2012, 18:30
    #38064867
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Unhandled exception at 0x76f915de in ttt.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0037f794..
при компиляции выдает вот это :), я пишу в visual studio 2010, не знаю он норм подходит для с++ ???

фаилик который создается прикрепил
...
Рейтинг: 0 / 0
04.12.2012, 19:26
    #38064990
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rndaunito,

Код: sql
1.
2.
3.
4.
5.
6.
7.
// Если у тебя есть указатели на char
 char* name = "Motorbike";
 char* color = "Blue";
// Зачем ты делаешь указатель на указатель, да еще и тип ему меняешь? Ничего удивительного что у тебя программа падает. 
 outfile.write(reinterpret_cast<char *>(&name), sizeof(name));
 
outfile.write(reinterpret_cast<char *>(&color), sizeof(color));


В общем, прежде чем лезть в файлы, прочитай в учебнике главу про указатели еще раз.
Не используй CAST функции вообще. Во всяком случае в ближайший год они тебе только вредить будут.
...
Рейтинг: 0 / 0
04.12.2012, 19:58
    #38065055
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
 ofstream outfile("d:\\test.bin", ios::binary);
 if (!outfile)
 {
 cout<<"error1"<<endl;
 _getch();
 return 1;
 }
 char* name = "Motorbike";
 char* color = "Blue";

//int l = strlen(name);
 //outfile.write(reinterpret_cast<char *>(&l), 1);

 //int c = strlen(color);
 //outfile.write(reinterpret_cast<char *>(&c), 1);

 outfile.write(name, sizeof(name));
 
outfile.write(color, sizeof(color));

 int speed = 1525;
 outfile.write(reinterpret_cast<char *>(&speed), sizeof(int));

 float power = 331.3;
 outfile.write(reinterpret_cast<char *>(&power), sizeof(float));

 outfile.close();
 

ifstream infile("d:\\test.bin", ios::binary);
 if (!infile)
 {
 cout<<"error2"<<endl;
 _getch();
 return 2;
 }

 int l_r;
 int c_r;
 
int x;
 int speed_r;
 float power_r;

 //infile.read(reinterpret_cast<char *>(&l_r), 1);
 char *name_r = new char[9];
 //infile.read(reinterpret_cast<char *>(&c_r), 1);
char *color_r= new char[4];
 infile.read(name_r, sizeof(name_r));
 infile.read(color_r, sizeof(color_r));
 infile.read(reinterpret_cast<char*>(&speed_r), sizeof(speed_r));
 infile.read(reinterpret_cast<char*>(&power_r), sizeof(power_r));
 
infile.close();
 cout << name_r << ' '<<color_r<<' '<<speed_r<<' '<<power_r<<' ';



Вот так заработало, только выдает не совсем то, не наведете еще куда нибудь ?), а вот с размерами колор и нейм вообще не пашет.
вот что щас выдает

Moto═════¤¤¤¤лллллллл■ю■ Blue¤¤¤¤лллллллл 1525 331.3
...
Рейтинг: 0 / 0
04.12.2012, 20:29
    #38065102
размер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
char* name = "Motorbike";
char* color = "Blue";


char name[] = "Motorbike";
char color[] = "Blue";


Чтобы размер правильно определяло.
...
Рейтинг: 0 / 0
04.12.2012, 20:31
    #38065104
и так ещё
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
char *name_r = new char[9];
char *color_r= new char[4];


char *name_r = new char[sizeof(name)];
char *color_r= new char[sizeof(color)];
...
Рейтинг: 0 / 0
05.12.2012, 00:07
    #38065320
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
размер,

std::string name = "Motorbike";
std::string color = "Blue";

чтобы вообще не парица, чё
...
Рейтинг: 0 / 0
05.12.2012, 00:27
    #38065359
размер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
egorychразмер,

std::string name = "Motorbike";
std::string color = "Blue";

чтобы вообще не парица, чё
Ну сейчас насоветуешь...
Код: plaintext
1.
2.
    std::string name = "Motorbike";
    std::cout << sizeof(name);


вывод4
тогда уж надо рассказывать про size() и data().
...
Рейтинг: 0 / 0
05.12.2012, 09:44
    #38065602
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
	ofstream outfile("c:\\test.bin", ios::binary);
	if (!outfile)
	{
		cout<<"error1"<<endl;
		_getch();
		return 1;
	}
	char* name = "Motorbike";
	char* color = "Blue";

	int l = strlen(name);
	outfile.write(reinterpret_cast< char *>(&l), sizeof(int));

	int c = strlen(color);
	outfile.write(reinterpret_cast<char *>(&c), sizeof(int));

	outfile.write(name, sizeof(name));
	
	outfile.write(color, sizeof(color));

	int speed = 1525;
	outfile.write(reinterpret_cast<char *>(&speed), sizeof(speed));

	float power = 332.22;
	outfile.write(reinterpret_cast<char *>(&power), sizeof(power));

	outfile.close();
	

	ifstream infile("c:\\test.bin", ios::binary);
	if (!infile)
	{
		cout<<"error2"<<endl;
		_getch();
		return 2;
	}
	int l_r;
	int c_r;
	
	int x;
	int speed_r;
	float power_r;

	infile.read(reinterpret_cast<char *>(&l_r), sizeof(l_r));
	char *name_r = new char[l_r];
	infile.read(reinterpret_cast<char *>(&c_r), sizeof(c_r));
	char *color_r= new char[c_r];
	infile.read(name_r, sizeof(name_r));
	infile.read(color_r, sizeof(color_r));
	infile.read(reinterpret_cast<char*>(&speed_r), sizeof(speed_r));
	infile.read(reinterpret_cast<char*>(&power_r), sizeof(power_r));
	
	infile.close();
	cout << l_r<<' '<< c_r<<' '<< name_r << ' '<<color_r<<' '<<speed_r<<' '<<power_r<<' ';



Выдает в консоли
9 4 Moto═════¤¤¤¤лллллллл■ю■ Blue¤¤¤¤лллллллл 1525 332.22

Вопрос откуда берутся лишние символы ??? Спасибо.
...
Рейтинг: 0 / 0
05.12.2012, 12:07
    #38065890
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Никогда не понимал смешения стилей.
...
Рейтинг: 0 / 0
05.12.2012, 12:52
    #38066034
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Код: plaintext
1.
2.
3.
4.
        infile.read(reinterpret_cast<char *>(&l_r), sizeof(l_r));
	char *name_r = new char[l_r+1];
	infile.read(name_r, l_r);
        name_r[l_r]=0;
...
Рейтинг: 0 / 0
05.12.2012, 16:16
    #38066516
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
не помогает, тоже самое выдает...
...
Рейтинг: 0 / 0
05.12.2012, 16:47
    #38066589
pirovindos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rnне помогает, тоже самое выдает...

Вместо
Код: plaintext
1.
2.
infile.read(name_r, sizeof(name_r));
infile.read(color_r, sizeof(color_r));


нужно
Код: plaintext
1.
2.
infile.read(name_r, l_r);
infile.read(color_r, c_r);



И еще то, что написал m_Sla (в двух местах).
...
Рейтинг: 0 / 0
05.12.2012, 16:54
    #38066612
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rnне помогает, тоже самое выдает...Что в файл записал, то и вывел.
Код: plaintext
1.
2.
3.
      // вот это добавь и посмотри чему sizeof(name) равен
      cout<<sizeof(name)<<endl;
      outfile.write(name, sizeof(name));


Поставь Far например и посмотри, что ты реально в test.bin записываешь.
...
Рейтинг: 0 / 0
05.12.2012, 17:00
    #38066629
pirovindos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Un1c0rn,
Еще и в записи тоже не та длина.
Вместо
Код: plaintext
1.
2.
	outfile.write(name, sizeof(name));
	outfile.write(color, sizeof(color));


нужно
Код: plaintext
1.
2.
	outfile.write(name, l);
	outfile.write(color, c);
...
Рейтинг: 0 / 0
05.12.2012, 18:56
    #38066859
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
 ofstream outfile("d:\\test.bin", ios::binary);
 if (!outfile)
 {
 cout<<"error1"<<endl;
 _getch();
 return 1;
 }
 char* name = "Motorbike";
 char* color = "Blue";

int l = strlen(name);
outfile.write((char *)&l, sizeof(int));

int c = strlen(color);
outfile.write((char *)&c, sizeof(int));

outfile.write(name, l);
 
outfile.write(color, c);

 int speed = 1525;
 outfile.write((char *)(&speed), sizeof(int));

 float power = 331.3;
 outfile.write((char *)(&power), sizeof(float));

 outfile.close();
 

fstream infile("d:\\test.bin", ios::binary | ios::in | ios::out);
 if (!infile)
 {
 cout<<"error2"<<endl;
 _getch();
 return 2;
 }

 int l_r;
 int c_r;
 
int x;
 int speed_r;
 float power_r;

infile.read((char *)(&l_r), sizeof(int));
char *name_r = new char[l_r+1];
 name_r[l_r]=0;
infile.read((char *)(&c_r), sizeof(int));
char *color_r= new char[c_r+1];
 color_r[c_r]=0;

 infile.read(name_r, l_r);
 infile.read(color_r, c_r);
 infile.read((char*)(&speed_r), sizeof(int));
 infile.read((char*)(&power_r), sizeof(float));
 
 infile.close();
 cout << name_r << ' '<<color_r<<' '<<speed_r<<' '<<power_r<<' ';


премного благодарен, с нулями бы никогда не догодался, так работает. Еще можно вопросик, вот формат длины имени и длины цвета, должны быть 1 байт, по условию задачи. Не подскажете это мне как реализовать?
...
Рейтинг: 0 / 0
06.12.2012, 03:18
    #38067194
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Переменные l и с определяй не как int , а как переменные с размером 1 байт.
...
Рейтинг: 0 / 0
06.12.2012, 08:04
    #38067255
Un1c0rn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с бинарными файлами в c++
Ну я определил их как char, это же нормально ???
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с бинарными файлами в c++ / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]