Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: fprintf
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
есть текстовый файл, там что-то типа такого

Код
12-раз-,22+два,здрасте-я-тетя


делаю

Код
char raz[20],dva[20,tri[20];

fscanf(file, "%s,%s,%s", raz, dva, tri);


в результате уже raz содержит
Код
12-раз-,


или я неправильно все понял, или какого там запятая делает?
Alex11
Формат типа %s подразумевает ограничитель типа пробел, табуляцию или 0. Так что в исходном файле посе запятой, скорее всего, стоит типа пробел. И запятая, типа, на выходе должна быть. Если нарисуете, что хотите получить на выходе, и что точно на входе, то можно попытаться написать правильный типа формат.
demiurg_spb
Ну и наверное стоило обезопасить себя на предмет переполнения приёмного буфера.
Код
char buf[20];
memset(buf, '\0', 20);
fscanf(file, "%19s", buf);
Не проверял, но думаю что как-то такsm.gif
toweroff
Цитата(Alex11 @ Nov 21 2011, 02:27) *
Если нарисуете, что хотите получить на выходе, и что точно на входе, то можно попытаться написать правильный типа формат.

входную строку я указал - буквы/символы/цифры (кроме запятых), разделенные запятыми
на выходе - получить то, что между запятыми, в соответствующие массивы, указанные в качестве параметров

я могу это все сделать руками, но потянуло на халявку sm.gif
Палыч
Цитата(toweroff @ Nov 21 2011, 12:20) *
я могу это все сделать руками, но потянуло на халявку sm.gif
Как уже было сказано выше Alex11: %s вводит символы до первого "пробельного". Поэтому, таким способом Вам строку на части не разделить. Можно ввести всю строку целиком (с помощью fgets, например), а затем разделить функцией strtok. Но, функция strtok - "ещё та штучка"...
toweroff
Цитата(Палыч @ Nov 21 2011, 13:30) *
Как уже было сказано выше Alex11: %s вводит символы до первого "пробельного". Поэтому, таким способом Вам строку на части не разделить. Можно ввести всю строку целиком (с помощью fgets, например), а затем разделить функцией strtok. Но, функция strtok - "ещё та штучка"...

да, в принципе, не лень мне три раза сваять что-то типа

Код
memset(raz, '\0', RAZ_SIZE);
memset(dva, '\0', DVA_SIZE);
memset(tri, '\0', TRI_SIZE);

while (*string && *string!=',') *raz++ = *string++;
string++;
while (*string && *string!=',') *dva++ = *string++;
string++;
while (*string) *tri++ = *string++;


sm.gif
skripach
Цитата
Но, функция strtok - "ещё та штучка"...

А что не так с strtok ?
Я файл читаю построчно и "парсю" strtok'ом.
сточки типа 30|10|0.005|0.005|0.100|0.001|0.01|5|3|7|6|3|0 глотает с радостью.
Палыч
Цитата(skripach @ Nov 21 2011, 14:20) *
А что не так с strtok ?

Работает она так, как и должна (описано в стандарте). Но, мне очень не нравятся процедуры, которые "гадят" в свои параметры, кроме того, эта процедура использует статический буфер при разборе строки, и поэтому нужно заботиться о предотвращении одновременного вызова её из разных ветвей (потоков).
Alex11
Думаю я, что следующая спецификация Вам поможет:
Код
fscanf(file, "%[^,],%[^,],%[^,]", raz, dva, tri);
или
fscanf(file, "%[^,\0],%[^,\0],%[^,\0]", raz, dva, tri);
- если будут проблемы с концом строки.

Возможны еще варианты в зависимости от того, что на конце строки при вводе и что нужно получить в этом случае.
XVR
Цитата(Палыч @ Nov 21 2011, 15:20) *
эта процедура использует статический буфер при разборе строки, и поэтому нужно заботиться о предотвращении одновременного вызова её из разных ветвей (потоков).
Не нужно. Нужно лишь правильно указать версию run-time'а (multithread), он позаботится, что бы strtok из разных потоков не передрались rolleyes.gif
demiurg_spb
Цитата(XVR @ Nov 22 2011, 10:32) *
Не нужно. Нужно лишь правильно указать версию run-time'а (multithread), он позаботится, что бы strtok из разных потоков не передрались rolleyes.gif
Где и как это делается?
Палыч
Цитата(demiurg_spb @ Nov 22 2011, 11:53) *
Где и как это делается?
Это - он не про микроконтроллеры...
demiurg_spb
Понятно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.