Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение файла fgets(), sscanf()

3.2K
19 октября 2007 года
Gazzy
38 / / 02.08.2006
может ли сочетание функций fgets() и sscanf() читать файл, где в качестве разделителя используется запятая???
Спасибо
505
20 октября 2007 года
vAC
343 / / 28.02.2006
можно попробовать обойтись fscanf, при этом в форматной строке нужно будет явно указать запятую
3.2K
20 октября 2007 года
Gazzy
38 / / 02.08.2006
Это как? указать в качестве незначащего символа?
505
20 октября 2007 года
vAC
343 / / 28.02.2006
Наверно я был не прав, fscanf не подходит для чтения CSV (Comma-Separated Values). Придется мутить с буффером.
Такой вариант работать будет точно:
1. считать файл (или строку файла) в строковый буффер;
2. заменить символы запятой на символ пробела;
3. читать слова функцией sscanf, при этом форматная строка будет выглядеть просто - "%s %d ...";

Получаеися, что fgets и sscanf хватает ;)

Можно использовать какие-нибудь другие стандартные функции, типа strtok для поиска очередного слова после запятой.
3.2K
20 октября 2007 года
Gazzy
38 / / 02.08.2006
Спасибо большое
1.6K
21 октября 2007 года
Vov4ick
476 / / 01.02.2007
Цитата: vAC
читать слова функцией sscanf, при этом форматная строка будет выглядеть просто - "%s %d ..."


А если "%s,%d,%f, и так далее" ? Функциям *scanf всё равно, какой символ пропускать, запятую или пробел.

505
21 октября 2007 года
vAC
343 / / 28.02.2006
Для чисел такой вариант может и подойдет, да и то, не во всех случаях. scanf - туповатая функция.
Если есть строка "Hello, world!", то при чтении слов по формату "%s, %s" в первой получим "Hello,", а во второй вообще ничего, т.к. после первого слова запятая не встретилась (она включилась в первое). Строку и шаблон нужно задавать "дословно". Например, будут работать следующие пары:
"Hello ,world!" - "%s ,%s"
"Hello , world!" - "%s ,%s"
Первый работает потому, что мы сначала сообщили, что после первого слова стоит пробел и запятая, а после них второе слово.
Второй работает, т.к. пробел рассматривается как разделитель между запятой и вторым словом, поэтому он просто выбрасывается.

Такой вариант:
"Hello , world!" - "%s,%s"
Работать уже не будет, т.к. после чтения "Hello", scanf будет ждать запятую, а встретит пробел.

Вообщим проблема в том, что вы не остановите scanf перед уничтожением запятых в конце слова, для него они будут его частью.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог