powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с бинарными файлами в c++
25 сообщений из 27, страница 1 из 2
Работа с бинарными файлами в c++
    #38064632
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите пожалуйста, что то целый день читаю про работу с файлами и никак не могу понять как работать с бинарными файлами
суть задания такая

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

char* name = "Motorbike";
char* color = "Blue";
int speed =155;
float power = 3.3;
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38064637
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше покажи как пишешь
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38064659
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Работа с бинарными файлами в c++
    #38064715
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un1c0rn, оформляйте исходники с использованием
тега [src]
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38064793
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
int speed = 1525;
outfile.write(reinterpret_cast<char *>(&speed), sizeof(double));


Что ты пытаешься записать этим кодом?
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38064804
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Работа с бинарными файлами в c++
    #38064805
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito
Код: plaintext
1.
2.
int speed = 1525;
outfile.write(reinterpret_cast<char *>(&speed), sizeof(double));


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

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

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

фаилик который создается прикрепил
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38064990
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Работа с бинарными файлами в c++
    #38065055
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Работа с бинарными файлами в c++
    #38065102
размер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
char* name = "Motorbike";
char* color = "Blue";


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


Чтобы размер правильно определяло.
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38065104
и так ещё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Работа с бинарными файлами в c++
    #38065320
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
размер,

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

чтобы вообще не парица, чё
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38065359
размер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Работа с бинарными файлами в c++
    #38065602
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Работа с бинарными файлами в c++
    #38065890
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не понимал смешения стилей.
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38066034
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Работа с бинарными файлами в c++
    #38066516
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не помогает, тоже самое выдает...
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38066589
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Работа с бинарными файлами в c++
    #38066612
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Un1c0rnне помогает, тоже самое выдает...Что в файл записал, то и вывел.
Код: plaintext
1.
2.
3.
      // вот это добавь и посмотри чему sizeof(name) равен
      cout<<sizeof(name)<<endl;
      outfile.write(name, sizeof(name));


Поставь Far например и посмотри, что ты реально в test.bin записываешь.
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38066629
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Работа с бинарными файлами в c++
    #38066859
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Работа с бинарными файлами в c++
    #38067194
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переменные l и с определяй не как int , а как переменные с размером 1 байт.
...
Рейтинг: 0 / 0
Работа с бинарными файлами в c++
    #38067255
Un1c0rn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я определил их как char, это же нормально ???
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с бинарными файлами в c++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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