![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
У меня программа должна уметь сохранять, а через некоторое время читать информацию из файла в формате .csv(значения разделённые ;).
(Чтобы можно было через Excel открывать). В файле хранится: версия программы, количество типов содержимого ячеек таблицы, типы содержимого ячеек таблицы, размер таблицы, таблица В общем, пример содержимого файла я прикрепил. Его создаёт такой код
Вопрос в том, как можно произвести обратное действие? 1. Можно построчно читать файл и разбирать строки на составляющие вручную. 2. Думаю с помощью функции fscanf() это можно реализовать удобнее, но как? На сколько я понял сканф останавливает сканирование как только находит пробел и уже при первом вызове, строка, которую он создаёт, содержит только один символ "V"(что для меня не очень удобно). Это сообщение отредактировал(а) nns2009 - 14.2.2009, 13:20 Присоединённый файл ( Кол-во скачиваний: 7 )
first.txt 0,68 Kb |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Не верно! -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
csv-файл удобнее всего читать построчно и разбирать каждую строку на лексемы, разделеные заданным символом (;). Это элементарно написать самому, но есть и готовые функции, нарпимер strtok. А уже отдельные слова интерпретировать вообще пустяк. scanf удобно использовать тогда, когда формат абсолютно фиксирован и точно известен.
-------------------- ... |
|||
|
||||
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
А разве у меня формат не фиксирован? : версия количество данных данные количество данных данные Каждая часть данных записывается на отдельной строке в одинаковом формате. Ну, если что буду разбирать построчно. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Если есть "кол-во данных", а потом "данные" в этом самом количестве, то нет. Как ты формат для scanf запишешь, если во время компиляции неизвестно сколько "данных" читать? Ну то есть можно поизвращаться, но разбор на лексемы проще и нагляднее по результирующему коду. -------------------- ... |
|||
|
||||
| nns2009 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Но ведь по идее данные серавно читаются в цикле, даже если их известное количество изначально, а внутренняя часть цикла одинакова для известного числа чтений:
Можете привести пример кода(с использованием fscanf()), который читает данные из файла, созданного функцией SaveTable() (в моём первом сообщении) для определённого числа данных, предположим трёх. |
||||||
|
|||||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
||||
|
||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
вывод
Это сообщение отредактировал(а) inside_pointer - 17.2.2009, 13:44 |
|||
|
||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
подредактировал чтобы читала построчно и разбирала каждую строку через strtok
вывод
ни strtok ни fscanf не могут залезть между ;; и вывести, что там ничего нет, если юзать fscanf, её работа будет сведена к посимвольному разбору (то есть то же самое, что просто символы анализировать); многие путают и думают что fscanf это обратный аналог к fprintf, на самом деле это совершенно различные функции и их следует изучать по отдельности, иначе будет путаница Присоединённый файл ( Кол-во скачиваний: 4 )
parse_mod.tar 20,00 Kb |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
strtok может, а вот scanf действительно нет. -------------------- ... |
|||
|
||||
| nns2009 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Я тоже так думал. А есть ли тогда обратный аналог fprintf();
На сколько я понял strtok(); возвращает строку до разделителя, а в строке, переданной через параметр, обрезает её с разделителем
А зачем эти функции были написаны? А также зачем вот это: Print(""); Это сообщение отредактировал(а) nns2009 - 19.2.2009, 15:37 |
||||||
|
|||||||
| inside_pointer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
новая версия теперь через fscanf (сохраняет лексемы в массив, выводит пустоты как пустоты)
strtok не может пролезть между ;;;, т.к. она вместо каждого разделителя записывает нуль-символ и переводит указатель поиска на следующую лексему после него, если встречает конец строки возвращает нулевой указатель Добавлено через 2 минуты и 11 секунд
она может вывести что угодно, то есть множество обратных аналогов стремится к бесконечности, потому наверное и нету Присоединённый файл ( Кол-во скачиваний: 4 )
parse2.tar 20,00 Kb |
||||
|
|||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
там баг с последним значением
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Бог ты мой какие сложности! -------------------- ... |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
strtok() заменяет разделители нулями, поэтому если есть разные разделители, невозожно определить какой он был.
Кроме того, он портит исходную строку, поэтому иногда её нужно предварительно скопировать. Другие функции, которые можно использовать вместо неё для поиска разделителей: strspn(), strcspn(), strchr(), strstr() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |