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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2012, 23:13   #1
zanzin
 
Регистрация: 29.05.2012
Сообщений: 4
Вопрос Проблема с чтением файла. (Visual C++)

Дорогие форумчане, большая просьба помочь. Недавно мною была создана курсовая работа. Она прекрасно и полно работает в режиме отладки, но когда я сделал установщик и установил программу, то перестал открываться один единственный файл. Все остальные прекрасно открываются. Единственная разница, что файл, который не функционирует (Test_out) открывается на дозапись:

Код:
 fstream f("Test.txt",ios::in);										
   fstream g("Test_answers.txt",ios::in);								
   fstream h("Test_out.txt",ios::app);								
   if (f.is_open() && g.is_open() && h.is_open())		
      {...}
   }else cout<<"Файл не найден!";										
   f.close();																			
   g.close();															
   h.close();
И ещё, там в основной функции этот файл тоже открывается на дозапись, точно так же, только имя потока другое, не знаю, нормально ли, что по сути одновременно существуют два потока, связанные с этим файлом, но в режиме отладки всё работает, и, когда я убрал этот второй поток, ничего не изменилось, ни в режиме отладки, ни в уже установленной программе. Пишет "файл не найден" и всё.

Последний раз редактировалось zanzin; 29.05.2012 в 23:26.
zanzin вне форума Ответить с цитированием
Старый 29.05.2012, 23:47   #2
ps10n1ck
Пользователь
 
Аватар для ps10n1ck
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

Если не ошибаюсь одновременно два потока не будут работать на дозапись в один и тот же файл, по идее, когда первый поток открывает файл - он его блокирует для работы с ним, тогда второй поток выдаст сообщение, что файл не удалось открыть. Но возможно я и ошибаюсь.. Точно уже не помню..

если можно кинь весь код где у тебя и как происходит работа с файлами - т.к. тут ничего не понятно....

Последний раз редактировалось ps10n1ck; 29.05.2012 в 23:56.
ps10n1ck вне форума Ответить с цитированием
Старый 29.05.2012, 23:54   #3
zanzin
 
Регистрация: 29.05.2012
Сообщений: 4
По умолчанию

Ну, я с удовольствием, только там 1800 строк) Сейчас попробую вычленить нужное.

Код:
int main(int argc, char *argv[])//Основная функция.
{
	system("Color 0F");
// Вывод заголовка
	Title();
	_getch();
	system("cls");
// Вывод меню
  
	char item;
	do 
	{   
		setlocale(LC_ALL, "russian");
		Menu();
		cout<<setw(43)<<"Введите выбранное: ";
		cin >> item;
		fstream f1("Test_out.txt",ios::app);					
		switch (item)
		{
		case '1' :
			 cin.clear();
			 cin.ignore(cin.rdbuf()->in_avail());
			theory();
			break;
		case '2':
			 cin.clear();
			 cin.ignore(cin.rdbuf()->in_avail());
			 Readme();
		    system("cls");
			Deck();    //Демонстрация работы с деками;
			break;
			break;
		case '3':
			 cin.clear();
			 cin.ignore(cin.rdbuf()->in_avail());
				char Display;											
				system("cls");											
				Test(0);												
				Mark(0,0);												
				_getch();											
				cout<<endl<<"Вывести правильные ответы на экран? "<<endl<<"1.Да"<<endl<<"0.Нет"<<endl;
				cout<<"Введите нужное: ";
				cin>>Display;
				while (Display<'0' || Display>'1')
				{
					cout<<"Введено неверное значение! Введите заново: ";
					cin>>Display;
				}
				system("cls");											
				Test_Stat(0 , Display);								
				if (f1.is_open())										
				{
					f1<<endl<<endl<<"**************************************************"<<endl;
				}
				f1.close();												
				if (Display) _getch();								
			break;	

		default: 
			 cin.clear();
			 cin.ignore(cin.rdbuf()->in_avail());
			if (item!='0') 
			{
				setcolor(12);
				cout<<setw(68)<<endl<<"Такого пункта меню не существует. Введите существующий пункт меню!" << endl;
				setcolor(15);
				_getch();
			}    
		} 
		system("cls");
	}
	while (item!='0');


  return 0;
}

Вот основная функция^

Последний раз редактировалось Stilet; 30.05.2012 в 07:20.
zanzin вне форума Ответить с цитированием
Старый 30.05.2012, 00:01   #4
zanzin
 
Регистрация: 29.05.2012
Сообщений: 4
По умолчанию

Код:
void Test_Stat (int counter, char Display) // функция ведения статистики теста в файле Test_out.txt. (может выводить на экран).	

{	
	fstream f("Test.txt",ios::in);										// открытие файла Test.txt на чтение.
	fstream g("Test_answers.txt",ios::in);								// открытие файла Test_answers.txt на чтение.
	fstream h("Test_out.txt",ios::app);								// открытие файла Test_out.txt на дозапись.
	if (f.is_open() && g.is_open() && h.is_open())						// если все файлы открылись.
	{
		int right_answer_number;										// номер правильного ответа на этот вопрос.
		char question[100],answer_1[50],answer_2[50],answer_3[50],answer_4[50],right_answer[50],your_answer[50];
		
		for (int i=0; i<Test_questions[counter]; i++)					// пока не ошли до нужного вопроса. (с порядковым мномером counter).
		{
			g>>right_answer_number;										// считываем номер правильного ответа на вопрос из файла Test_answers.txt.
			f.getline(question,sizeof(question));						// считываем вопрос из файла Test.txt.
			if (right_answer_number == 1)  f.getline(right_answer,sizeof(right_answer));
			else
			{if (Test_answers[counter] == 1) f.getline(your_answer,sizeof(your_answer));
			else f.getline(answer_1,sizeof(answer_1));}
			// считываем 1 вариант ответа. если он был верным (right_answer_number = 1) считываем его в right_answer.
			// иначе если это ответ данный пользователем (Test_answers[counter] = 1) считываем его в your_answer.
			// иначе считываем его в answer_1.

			if (right_answer_number == 2)  f.getline(right_answer,sizeof(right_answer));
			else
			{if (Test_answers[counter] == 2) f.getline(your_answer,sizeof(your_answer));
			else f.getline(answer_2,sizeof(answer_2));}
			// считываем 2 вариант ответа. если он был верным (right_answer_number = 2) считываем его в right_answer.
			// иначе если это ответ данный пользователем (Test_answers[counter] = 2) считываем его в your_answer.
			// иначе считываем его в answer_2.

			if (right_answer_number == 3)  f.getline(right_answer,sizeof(right_answer));
			else
			{if (Test_answers[counter] == 3) f.getline(your_answer,sizeof(your_answer));
			else f.getline(answer_3,sizeof(answer_3));}
			// считываем 3 вариант ответа. если он был верным (right_answer_number = 3) считываем его в right_answer.
			// иначе если это ответ данный пользователем (Test_answers[counter] = 3) считываем его в your_answer.
			// иначе считываем его в answer_3.

			if (right_answer_number == 4)  f.getline(right_answer,sizeof(right_answer));
			else
			{if (Test_answers[counter] == 4) f.getline(your_answer,sizeof(your_answer));
			else f.getline(answer_4,sizeof(answer_4));}
			// считываем 4 вариант ответа. если он был верным (right_answer_number = 4) считываем его в right_answer.
			// иначе если это ответ данный пользователем (Test_answers[counter] = 4) считываем его в your_answer.
			// иначе считываем его в answer_4.
		}
		counter++;
		h<<endl<< counter  <<" вопросом был: "<<endl;					// вывод в файл данных о тесте.
		h<< question <<endl;											// вывод вопроса, который был задан counter'м посчёту. 
		h<<"Правильный ответ: "<<right_answer_number<<" - "<< right_answer <<endl;
		// вывод номера правильного ответа. // вывод правильного ответа.
		if ( right_answer_number == Test_answers[counter-1]) h<<"Вы ответили правильно."<<endl;
		// если номер правильного ответа равен номеру ответа пользователя - вывод "Вы ответили правильно.".ь
		else h<<"Вы ответили : "<<Test_answers[counter-1]<<" - "<< your_answer <<endl;
		// иначе вывод номера ответа пользователя. // вывод ответа пользователя.
		if (Display=='1')													// если нужно выводить на экран.
		{
			cout<<endl<< counter  <<" вопросом был: "<<endl;			// вывод на экран данных о тесте.
			cout<< question <<endl;										// вывод вопроса, который был задан counter'м посчёту. 
			cout<<"Правильный ответ: "<<right_answer_number<<" - "<< right_answer <<endl;
			// вывод номера правильного ответа. // вывод правильного ответа.
			if ( right_answer_number == Test_answers[counter-1]) cout<<"Вы ответили правильно."<<endl;
			// если номер правильного ответа равен номеру ответа пользователя - вывод "Вы ответили правильно.".
			else cout<<"Вы ответили : "<<Test_answers[counter-1]<<" - "<< your_answer <<endl;
			// иначе вывод номера ответа пользователя. // вывод ответа пользователя.
		}
		if (counter < 5)												// если ещё не вывели все 5 вопросов.
		{
			f.close();													// закрываем файл.
			g.close();													// закрываем файл.
			h.close();													// закрываем файл.
			Test_Stat(counter,Display);									// вызываем функцию ведения статистики теста в файле Test_out.txt.
		}
	}else cout<<"Файл не найден!";										// если не открылся выводим сообщение.
	f.close();															// закрываем файл.				
	g.close();															// закрываем файл.
	h.close();															// закрываем файл.
}
А вот функция, в которой имею дело с файлом Test_out.
zanzin вне форума Ответить с цитированием
Старый 30.05.2012, 00:03   #5
ps10n1ck
Пользователь
 
Аватар для ps10n1ck
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

я ошибся по поводу одновременного открытия файла - сделал простой тест, у меня нормально открылся один файл на дозапись обеими потоками и успешно прошла запись...

как я понял у тебя не работает программа, только когда ты устанавливаешь ее с установщика? Попробуй удалить сам файл Test_out.txt - пусть программа попробует создать его сама заново. В коде вроде бы ничего плохого не нашел, вроде все гуд.

Последний раз редактировалось ps10n1ck; 30.05.2012 в 00:18.
ps10n1ck вне форума Ответить с цитированием
Старый 30.05.2012, 00:25   #6
zanzin
 
Регистрация: 29.05.2012
Сообщений: 4
По умолчанию

Спасибо, попытаюсь!
zanzin вне форума Ответить с цитированием
Старый 31.05.2012, 12:00   #7
ps10n1ck
Пользователь
 
Аватар для ps10n1ck
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от zanzin Посмотреть сообщение
Спасибо, попытаюсь!
вопрос твой решился? или проблема так и осталась?
ps10n1ck вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с чтением из файла salwator Помощь студентам 1 23.12.2010 12:11
Проблема с чтением из файла slamm PHP 12 16.01.2010 16:40
Проблема с чтением из INI файла JustKurt Общие вопросы Delphi 3 04.08.2009 20:47
Проблема с чтением типизированного файла. Вадим Буренков Общие вопросы Delphi 8 28.05.2009 13:31
проблема с чтением из файла Tesmont Общие вопросы C/C++ 0 20.05.2009 19:39