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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2011, 05:35   #1
Loginanton
 
Регистрация: 26.12.2008
Сообщений: 4
По умолчанию Баг visual c++?

Приветствую.
Есть файл такого содержимого:
2/3/4 1/5/821 8/33/23 1/1/1 2/2/1 3/3/1 4/4/1 5/5/1
Количество троек чисел не известно. Известно только что три числа разделены слешем и между такими тройками пробельные символы. Строк в файле несколько. Нужно каждую тройку прочесть и напечатать, когда конец строки вывести количество троек.
Как я пыталься это сделать:
Код:
#include <stdio.h>

int main(int argc, char** argv)
{
	FILE * f = fopen(argv[argc-1],"r");

	int x,y,z;
	int num = 0;
	
	while(1)
	{
		if(fscanf(f,"%d/%d/%d %*[^0-9\n]",&x,&y,&z) != 3)
		{
			printf("num : %d\n",num);
			num = 0;
			break;
		}
		else
		{
			printf("%d %d %d\n",x,y,z);
			num++;
		}
	}

	fclose(f);
	return 0;
}
По описанию функции fscanf() всё должно работать, однако конец строки пропускается и читается всё как одна строка. Конкретно, я заметил, fscanf не обрабатывает диапазон чисел. Помогите пожалуйста, скажите, что я делаю не так.

P.S. Понял в чём проблема, перевод строки - это тоже пробельный символ. Подскажите тогда как можно обнаруживать конец строки, чтобы парсить с помощью fscanf().

Последний раз редактировалось Loginanton; 01.09.2011 в 05:47. Причина: Я ололо
Loginanton вне форума Ответить с цитированием
Старый 01.09.2011, 10:55   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
 %*[^0-9\n]
это что такое?
где вы вычитали что он регекспы поддерживает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.09.2011, 11:56   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Пепел Феникса, все нормально, есть там такое. Например, тут об этом написано (литера преобразования [ - после n и перед s). Имеется в виду считывание всех символов, кроме цифр и переноса строки.

Loginanton, как вариант, попробуйте считывать построчно с помощью fgets и разбирать на числа с помощью sscanf:
Код:
char s[128];
//...
while (fgets(s, 127, f))
 {
 ssanf(s, "%d/%d/%d", &x, &y, &z);
 printf("%d %d %d\n",x,y,z);
 ++num;
 }
printf("num : %d\n",num);
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баг форума mrChester О форуме и сайтах клуба 27 15.06.2011 23:50
баг с DBEdit samouelson БД в Delphi 1 19.12.2009 00:20
непонятный баг brain-bras Общие вопросы C/C++ 4 14.10.2009 21:26
Баг в BDS2006 posdnyaa Софт 1 19.12.2007 12:31