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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2013, 10:40   #1
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
Печаль Проверка ввода числа... с некоторыми нюансами

Привет форумчанам.
Я только недавно перешел на Си, до этого сидел на Паскале.
У меня возникла пара вопросов по поводу метки конца файла.

Код:
in_file = fopen(argv[1], "r"); 
tmp_file = fopen("tmp_file.txt", "w");

	if (in_file)
	{
		while (!feof(in_file))
		{
			SrVal = fscanf(in_file, "%f", &Val);
			printf("%f ", SrVal);
			if (SrVal==1)
			{
				fprintf(tmp_file, "%f ", Val);
			}
			else
			{
				printf("\nWrong number in incomming data\n");
				exit(EXIT_FAILURE);
			}
		}
Тут argv[1] = "con".
Когда я ввожу метку конца файла (Ctrl+Z), последнее введенное в консоли число еще раз записывается в файл. Как этого избежать, я найти не смог.

И, собственно, про проверку ввода. Когда я ввожу действительные числа, все нормально (стабильно проверяет), но на метке конца файла он закономерно выдает ошибку. Что можно добавить в if, или какой конструкцией его заменить, чтобы можно было вводить только действительные числа и из файла, и из консоли?
Числа могут быть записаны как через пробел, так и на разных строчках.
Григоренко Степан вне форума Ответить с цитированием
Старый 26.09.2013, 11:30   #2
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

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

Странная у вас процедура проверки действительного числа
Код:
SrVal = fscanf(in_file, "%f", &Val);
			printf("%f ", SrVal); 
			if (SrVal==1)
Может лучше так?
Код:
SrVal = fscanf(in_file, "%f", &Val);

			printf("%f ", SrVal);// зачем он вам?
 /*При делении целого на единицу, остаток всегда будет равен нулю.
При делении вещественного на единицу, остаток будет равен десятичной части.*/
if ((SrVal % 1) != 0) // для нас != 0
Попробуйте сразу после WHILE поставить проверку на ввод символа EOF, если он- то выход. иначе работаем.

P.S. И не забываем fclose использовать, даже когда введен неверный символ
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 26.09.2013 в 11:44. Причина: fclose
SaLoKiN вне форума Ответить с цитированием
Старый 27.09.2013, 01:01   #3
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
По умолчанию

Нет, вы меня немного не поняли...

Цитата:
И не забываем fclose использовать, даже когда введен неверный символ
Я привел кусок программы, который относится к проблемному месту. Все fclose на своих местах.

Цитата:
printf("%f ", SrVal);// зачем он вам?
Просто тестовый вывод.

Цитата:
При делении вещественного на единицу, остаток будет равен десятичной части
*facepalm* А десятичная часть не может быть равна нулю? К тому же число В ЛЮБОМ СЛУЧАЕ читается как вещественное, будет это 4.4543 или просто 4.
Я же спрашивал: есть ли какая-либо стандартная конструкция для отлова выражений вида 4гнр26?

Цитата:
Попробуйте сразу после WHILE поставить проверку на ввод символа EOF, если он- то выход
За идею спасибо. Затупил...

А про двойную запись последнего числа в файл никто не подскажет?
Григоренко Степан вне форума Ответить с цитированием
Старый 27.09.2013, 08:56   #4
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Лол, я не затупил =) не правильно понял код, SrVal- это же всего лишь флаг, отвечающий за удачное/неудачное считывание символа.
тогда
Код:
if (SrVal==1)
			{
                            if ((Val % 1) != 0) 
                                fprintf(tmp_file, "%f ", Val);
                            else  
                               printf("\nWrong number in incomming data\n");
			}
			else
			{
				printf("\nWrong number in incomming data\n");
				exit(EXIT_FAILURE);
Цитата:
Я привел кусок программы, который относится к проблемному месту. Все fclose на своих местах.
а если попали сюда "exit(EXIT_FAILURE)", файл закрыли?

Цитата:
Числа могут быть записаны как через пробел, так и на разных строчках.
насколько я помню при считывании из файла,ему побарабану как они лежат там.

Цитата:
А про двойную запись последнего числа в файл никто не подскажет?
попробуйте закрыть файл где аварийное завершение программы, и пройдитесь по циклу в отладчике, просматривая значения SrVal и Val
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 27.09.2013 в 09:03.
SaLoKiN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка ввода целого числа C++ Tony95 Помощь студентам 1 19.09.2013 23:05
Форматирование ввода в колонку dataGridView и проверка правильности ввода tumanovalex C# (си шарп) 1 31.05.2011 19:56
Проверка ввода Paul_AG Общие вопросы C/C++ 16 11.06.2009 16:56
Проверка ввода Panda Помощь студентам 2 08.07.2008 19:23
Полная очистка директории с нюансами... Kerk Общие вопросы Delphi 9 13.07.2007 15:49