| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Считывание строк из файла на С |
| Автор: NetJunky 4.1.2010, 05:53 |
| Всем доброго времени суток. Возможно тема и не очень разумна, но ничего не найдя по моему вопросу пришлось спрашивать тут. Думаю сложного в этом ничего нету, но у меня немного проблемно. Подскажите пожалуйста, как можно считать строку из файла, если я не знаю размера строки. Тоесть может быть, как мега большая, так и вообще пустая. Заранее всем спасибо. |
| Автор: bourne 4.1.2010, 05:59 |
| fgetc() должна помочь |
| Автор: NetJunky 4.1.2010, 12:05 |
| Тоесть варианта, как разом считывать строку нету? Только по символьно? |
| Автор: zim22 4.1.2010, 12:55 |
| http://www.cplusplus.com/reference/clibrary/cstdio/fgets/ |
| Автор: zloyshprot 4.1.2010, 13:27 | ||
| Я позволю себе влезть в данную тему, потому как вопрос мой связан с ней =) Есть код, по вытаскиванию строчек из файла:
Собственно вопрос в том, что каждая строка считывается с переносом на следующую строку. т.е. вывод: File opened 1bla.txt 2bla.txt 3bla.txt 4bla.txt Press any key... Есть варианты, чтобы не было переносов на новую строку? А то мне надо дальше удалять файлы из списка, а я получаю Invalid argument и удаляется только самый последний файл из списка. |
| Автор: zim22 4.1.2010, 15:23 |
не обратил на это внимание. тогда fgetc |
| Автор: NetJunky 4.1.2010, 17:08 |
| zloyshprot, тебе надо fgetc. Так как тогда ты можешь каждый считываемый символ проверять на \n и если так, то делать запись за место \n на \0 и переходить на следующую строку. Вопрос такой. Если у меня массив вышел, который из трёх ячеек [1][3][\0]. Можно ли как-то верно перевести его в int или может есть какой-то алгоритм, как можно считать в int так чтобы получилось такое число? П.С. 13 привёл, как пример, может быть и любое другое. |
| Автор: ller 4.1.2010, 17:13 | ||
atoi() ? |
| Автор: djamshud 4.1.2010, 17:37 |
| Не сходите с ума, к черту посимвольное чтение. Читайте буферами и ищите в нем перенос строки. Также в GNU еще есть специальное расширение: man getline. |
| Автор: xvr 5.1.2010, 12:52 |
| Надо замэпить файл в память и искать строки в ней (с помощью memcmp например) |
| Автор: djamshud 5.1.2010, 14:47 |
| xvr предложил наилучший способ. Вечно я про него забываю. |
| Автор: NetJunky 6.1.2010, 02:19 |
| xvr, djamshud, я так понимаю, что Ваши советы были уже не на млй вопрос) |
| Автор: djamshud 6.1.2010, 02:27 |
| NetJunky, нет, на ваш:). Только это советы не в духе "вызвать такую-то функцию", а впринципе, как делать. Код получится более громоздким, но куда более эффективным. |
| Автор: NetJunky 6.1.2010, 03:54 |
| djamshud, просто memcmp ещё я могу понять, а вот getline() если я не ошибаюсь используется только начиная с С++, а значит уже изначально не подходила. Так как спрашивал именно про Си, но всёравно спасибо. Просто далее был вопрос от человека у котого пример на С++, вот и решил, что ответ уже ему адресуются. |
| Автор: djamshud 6.1.2010, 14:24 | ||
Это сишная функция, но, как я писал, ГНУтое расширение, т.е. не кроссплатформенно. |
| Автор: Powerhead77 6.1.2010, 17:57 | ||
Видимо не в тему. Считываем строку в буфер char str[]. Далее определяем длинну считанной строки и обрабатываем как нам надо. Модератор: не забываем пользоваться кнопочкой "Код" |
| Автор: NetJunky 10.1.2010, 19:34 | ||||
| Powerhead77, табуляцию можно было вроде сделать через \t. Вопрос такого характера вроде всё по этойже тематике. Если всёже не пользовать getline, а посимвольное считывание. Вот например. Имею файл, в нём матрица определённого размера. Между каждым значением ячейки матрицы, в файле может быть один или более пробелов.
Но данный вариант никак не получается из-за того, что чтобы atoi грамотно перевёл, после каждого значения должен стоять знак конца строки '\0'. Пример матрицы:
Возможно в данном примере нету таких мест, где более одного пробела, но такое надо рассматривать. Есть ли у кого-то предложения, как данное содержимое грамотно считать в двумерный динамический массив для которого память на этом этапе уже выдана? Выше, код того, как я пытался. |
| Автор: bsa 10.1.2010, 19:39 |
| а почему нельзя воспользоваться scanf/fscanf/sscanf со спецификатором %d"? |
| Автор: Dayx 10.1.2010, 20:14 | ||
| Много лет назад столкнулся с проблемой чтения разных строк. Ну и создал себе такую маленькую функцию. С тех пор горя не знаю...
Конечно, надо еще проверять удачность выполнения malloc и realloc. Но это уж каждый делает по своему вкусу... |
| Автор: bsa 10.1.2010, 21:28 | ||
Велосипедисты, блин. Тогда уж так:
|
| Автор: Dayx 12.1.2010, 23:12 |
Но в то время колеса у велосипедов были квадратные! Все равно, спасибо |
| Автор: bsa 13.1.2010, 11:05 |
| мне вообще непонятно, почему использовался goto вместо цикла (for или do/while)? Не слышал, что новичкам goto строго противопоказан? |