Anil-Saini77 Ответов: 1

Двоичный файл, открытый через C++, показывающий некоторые другие данные


class object
{ public:
char type,name[15],rating[6],time[8],recipe[];
int calories,tagno;
}ax;

class recipe
{ char type;

void log()
{
	setbkcolor(3);

       //	object ax(1);

	cout << "\n Enter the Tag of the dish for the recipe  ";
	gets(*tag);   

	char* txt = ".txt";
	strcat(*tag, txt);
	cout << *tag;

	clrscr();
	title();
	char ch;
	ifstream fin;
	fin.open(*tag, ios::in);

	fstream fout;
	fout.open("allfilesrecipe4.dat",ios::out|ios::in|ios::binary);

	if (!fin)
	{
		cout << "cannot open file"; getch(); exit(0);
	}
	int count=0;

	for(int i=0;fin;i++)
	{       char a3;
		fin.get(a3);
		//cout<<"<>";

		ax.recipe[i]=a3;

	       count++;
	}
///////////////////////////////////////////////////////////////////////////////
fout.seekp(0);
for(int j=0;j<=count;j++)
{
cout<<ax.recipe[j]; /////FIRST OUTPUT LOOP

	}
	getch();

	fout.write((char*)&ax,sizeof(ax));

	fin.close();
  
	again:
	object bx;
	fout.read((char*)&bx,sizeof(bx));
	fout.seekg(0);
clrscr();
	title();
		for(int k=0;k<=count;k++)
	{
	       cout<<bx.recipe[k];                                   **//////2ND OUTPUT LOOP**

	}
	getch();
       fout.close();
char c;
	cout << "\n       Enter 'h' to go back to home or press e to exit ";
	cin >> c;
	if (c == 'h')
	{
		clrscr(); home();
	}
	else if (c == 'a')
		goto again;
	else
		exit(0);

	getch();
}


Что я уже пробовал:

*В ПРИВЕДЕННОЙ ВЫШЕ ПРОГРАММЕ Я ПОЛУЧАЮ ДОПУСТИМЫЙ ТЕКСТ ПРИ ЗАПУСКЕ ПЕРВОГО ЦИКЛА ВЫВОДА, НО КОГДА Я ОТКРЫВАЮ ФАЙЛ ЧЕРЕЗ ДРУГОЙ ОБЪЕКТ, ТЕКСТ НЕ ТОТ ЖЕ САМЫЙ

https://user-images.githubusercontent.com/55504233/65167042-6d2e2600-da5f-11e9-8147-3dcf8a85748c.png[^]

https://user-images.githubusercontent.com/55504233/65167042-6d2e2600-da5f-11e9-8147-3dcf8a85748c.png[^]

CHill60

Вы пробовали отлаживать его, чтобы увидеть, что происходит?

jeron1

Я не могу себе этого представить
если (!fin)

или вот это
for (int i = 0; fin; i++)

работайте так, как вы думаете. Может быть, взгляните на следующее Для получения справочной информации
http://www.cplusplus.com/reference/fstream/ifstream/

CPallini

Как мы могли бы попытаться исправить это, не имея входного файла(ов)?

Stefan_Lang

В качестве примечания: никогда не называйте какой-либо класс "объектом". Особенно в окнах. Просто потому, что MS сделала именно это (хорошо, это "CObject", но это не лучше), это не делает его менее глупым: во-первых, в номенклатуре OO "объект" - это *экземпляр* "класса", А это что-то совершенно другое. Во-вторых, при написании программ с использованием ООП термин "объект" уже используется чрезмерно, и его следует избегать, чтобы избежать путаницы.

1 Ответов

Рейтинг:
2

Stefan_Lang

Существует несколько проблем с вашим кодом.

1. называть класс "объект" - это плохо. Смотрите мой комментарий выше.
2. обнародование всех членов класса означает, что вы не заинтересованы в его использовании, как если бы вы использовали класс в ООП. То, что у вас есть, - это структура C, а не класс. Если это то, что вы намеревались, прекрасно - но тогда не используйте класс, используйте структуру!
3. форматирование не является вашей сильной стороной: вы должны стремиться использовать согласованные правила форматирования структур данных и функционального кода. Не имеет большого значения, какие правила вы используете, если они последовательны и читаемы. В данный момент ваш код не является ни тем, ни другим. И это делает его более трудным для нас, чтобы прочитать и понять, что делает ваш код. Подсказка: существует множество языковых редакторов, которые могут помочь вам сохранить ваш код красиво отформатированным-на самом деле это не так уж много усилий.
4. определение класса рецепта является неполным. Это делает невозможным для нас решить, как он инициализируется, и какие члены он имеет.
5. ваша функция recipe::log() вызывает несколько функций, которые не являются стандартными функциями C++, и в вашем коде нет никаких операторов #include, которые дали бы нам подсказку, откуда могут исходить эти функции. В то время как большинство может сделать обоснованное предположение о setbkcolor() или clrscr(), ставки на title() отменяются. Еще одна вещь, которая занимает наше время выяснения, хотя это было бы тривиально для вас, чтобы предоставить эту жизненно важную информацию.

6. Эта линия:

ax.recipe[i]=a3;
сломаю вашу программу! Вы не указали размер для этого массива, что технически означает, что он имеет размер 0, и любая попытка получить доступ к элементу с любым смещением является неопределенным поведением! то, что происходит потом в вашем коде, на самом деле не имеет значения, потому что все может случиться, пока вы не исправите это!

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