![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
Добрый вечер
у меня есть input.txt который генерит програмка она выводит такой оутпут 1 sdf 3 closed fsd 0 fsdf 0 fsdf 0 2 sdf 4 closed fsd 0 fsdf 0 fsdf 0 fgdf 0 3 sdf 1 closed fsd 0 как мне прочитать такой файлик , если у меня первые четыре строки фиксированные , а остальное зависит , от того что в них найдено ...т.е. если в 3 строке находиться 2 это значит что после 4 строки будет 4 строки sdfsd 0 sdfsd 5 например я делаю так :
это естественно не работает , даже на одном варианте..подскажите как решить такую задачку? |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
В чём проблема-то?
Раз у тебя всё по строкам, то я бы читал fgets()'ом. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
а можно пример, а то я с с++ не дружу уже))..а то что из начальных данных нужно читать разное кол-во других данных?
|
|||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
\n не будет считаться ожидаемым символом, т.к. это один из символов пустого пространства, это будет равнозначно
|
||||
|
|||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
ну с этим вроде нормально) хотя может можно и без \n
|
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
в смысле у тебя блоки идут(функция их не воспримет как отдельные)
|
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
пользуясь fgets'ом ты читаешь строку и у тебя даже число читается как строка потом из строки вырезаешь всё до перевода строки sscanf(line, "%s", cmpline); (cmpline символьный массив длиной в 100) для сравнения строк используется функция stcmp которая возвращает -1, 0, 1 strcmp(cmpline, "2") == 0 дальше задаёшь параметр для цикла с fgets'ом, она не будет следить пустая строка там или нет, но и fscanf тоже не будет следить, если не применишь спецприёмы с квадратными скобочками типа %[^\n] для остановки на каждом переводе слежку для fgets'а можно задать с помощью той же функции сравнения strcmp(line, "\n") == 0 |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
мне просто надо прочитать сначала кусок ,из него понять скоко в нем будет пар,и читать это кол-во пар ,после него ,,,..это все пишеться в массив с индексов 1 например..и так далее,...эти кучки нужно записывать в индексированные массивы.. я не очень понимаю ,как мне например читать
строку например с 5 по , какойто разделительный знакк .. ? |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
что то она на eof материться
)мм, спасибо большое , очень выручили)!!! Это сообщение отредактировал(а) Su_ - 12.9.2008, 12:17 |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
здесь на примере не файла а потока ввода, обрабатывается кусок, проходим до тройки, после неё до нуля считаем количество строк (если две - пара есть)
ты спрашивал про символы, как читать с пятого символа строки если line[1000] = "12345"; то читать с тройки надо printf("%s\n", line+2); выведет 345 (line - это &line[0] - это как бы первый символ line+1 - второй символ, line+2 - третий символ) Это сообщение отредактировал(а) inside_pointer - 12.9.2008, 23:39 |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
ну как я понимаю line[1000] = "12345"; это sprintf(line,"12345");
и на строчке while ((p = fgets(line, MAXLINE, stdin)) != NULL) { , она зацикливаеться сама на себе ( |
|||
|
||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 2 Всего: 7 |
Su_, я не понял чего ты пытаешься сделать =), но после вот этого кода у тебя в переменной i будет лежать количество строк, а указатели на сами строки - в массиве line. Естесна они пронумерованы начиная с нуля.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
что то не работает ,
ругаеться сюда buf = malloc(filesize+1); и так error C2440: '=' : cannot convert from 'void *' to 'char *' |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
sscanf не может зациклиться сама на себе, т.к. это не scanf scanf работает с потоком ввода пока он не закончится, а sscanf работает со строкой пока она не закончится там закомментированные строки их надо в поток ввода вписать 1 sdf 3 closed fsd 0 fsdf 0 fsdf 0 она(программа) дойдёт до тройки, после тройки посчитает строки пока не встретится ноль |
|||
|
||||
Rpahut |
|
|||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 2 Всего: 7 |
Попробуй подключить "mozg.h", должно помочь. ;) Это сообщение отредактировал(а) Rpahut - 16.9.2008, 22:53 --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
вроде все сделал как хотел , одна загвоздка ..
если сделать в отдельном проекте то все нормально ,, когда себе встраиваю в виде функции то , пропускает цикл While , т.е. код:
в текксте программы указан вопрос , вообще не понимаю , по идею он не правильно считывает файл , но в отдельном проектк асболютно то же самое и там все нормально , .. как он может проходить проверки !res и выходить на while....!=NULL ,а так спасибо большое , наконец то разобрался))! |
|||
|
||||
inside_pointer |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
цикл заканчивает работу(это может быть и на самом первом шаге) когда fgets встретила конец файла или не смогла прочитать вообще что-либо из файла(такое бывает когда файл открыт на запись и читать из него нельзя) когда файл вообще не открыт случается сегфолт
эта запись означает что в строке должны быть куски по типу one two three four они могут быть и 1 2 3 4 то есть если у тебя abcdefg_hijklmn_opq_rstu это поместится в strt а остальные останутся пустыми и у тебя не будет кусков типа one\ntwo\nthree\nfour т.к. fgets читает только одну строку и в ней есть только один символ конца строки (в самом конце) при использовании sscanf(line, "%s", line); из строки считывается из "one two three four\n" только one из "one1\n" считывается one1 это использовано для того чтобы функции strcmp передавать на сравнение кусок без \n ещё
замени на
так уматнее |
||||||||||||
|
|||||||||||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
ну у меня result.txt выгледит так
что странно, при выноси в другой проект работает идеально ... пчему же он считает что там сразу кончается файл ... я думаю он его не правильно читает... вот токо запустил проверить , поменял формат r на r , и он заработал , что то тут не чисто , порой одно и то же поразному воспренимает ... ну вообще то спасибо большое , этот вопрос вроде как решил) |
|||
|
||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
осталось маленький подвопрос на это жу тему ..
как читать , не из файла а из строки , такого же типа файл
что бы в a[0] был musik в a[1] был pop и . д , до конца строки , ?? делал while(gets(buff)!=Null) не работает , не переходит дальше по строчке , что понятноо.. как же сделать? |
|||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
по поводу gets, забудь про неё, вместо неё используют fgets(line, MAXLINE, stdin)
а вот второе, разобрать строку, есть функция strtok, до полного разбирательства пользоваться не рекомендую, т.к. вроде всё красиво всё должно работать, однако потом напарываешься на всякую фигню (время теряешь)
такой работает, malloc делает что: она для каждой строки создаёт блок памяти её размера, потом в него её записывает, и дальше указатель на этот блок помещает в массив указателей получается массив указателей на строки Это сообщение отредактировал(а) inside_pointer - 19.9.2008, 07:30 |
||||
|
|||||
Su_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 1.8.2007 Репутация: нет Всего: нет |
мм , просто супер , спасибо большое , сегодня все всторил в программку , наладил , работает как часы , ))еще раз Огромное спаибо , я думаю вопрос РЕШЕН)!
|
|||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
вот ещё надыбал как можно читать строку с помощью scanf, правда нет ограничения на её длину (то есть можно ввести слишком длинную строку которая не предусмотрена)
в результате получается цикл где срабатывают строки
после каждой строки должен быть только один перевод строки, на двух и более цикл останавливается |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |