быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
1 | ||||||
Функция getc (FILE*) при первом вызве считывает НЕ ПЕРВЫЙ символ файла.Почему?13.08.2009, 08:11. Показов 4231. Ответов 18
Метки нет (Все метки)
Друзья! Здравствуйте! Вот код.
Трудно назвать такую работу корректной или предсказуемой. Может, я чего не так делаю? Упоминания о такой тонкости работы getc- то, что значение считываемого символа будет зависеть от работы fputc я нигде не встретил, ни в одном описании.
0
|
13.08.2009, 08:11 | |
Ответы с готовыми решениями:
18
Почему getline не считывает строку при первом проходе цикла? Функция getline считывает несколько строк из файла, игнорируя символ новой строки Почему функция putchar(); выводит только первый символ?(Короткий код) Функция getc() и удаление из файла всего, что было считано |
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||||
13.08.2009, 08:54 | 2 | |||||
Здравствуй, друг.
Я, конечно, хз, но, блин, вас, учили файлы закрывать? Вам рассказывали, что существует fclose? Вы когда-нибудь слышали про буферизованный ввод/вывод?..
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
13.08.2009, 10:20 [ТС] | 3 | ||||||||||
Спасибо конечно, но я тоже хз когда его закрывать надо, этот файл, а помнить-то я об этом помню. Пишут везде, так примерно:
Когда вы закончите все операции с файлом, то не забывайте закрыть файл (Стефан Кочан) Нормальная формулировка? K&R не цитирую, там вообще чёрт ногу сломит. Ну, вот, а программа подразумевает, что я и далее буду в файл что-то записывать. То есть я э... не все операции закончил. А будет ещё запись в файл, считывание, снова запись. Теперь же есть я буду делать так, как Вы сказали, но честно говоря, я не понял, почему неправильны мои действия. Разве что потому, что не достигнут желаемый результат. Что ж, на том и остановимся. А учусь я сам. Спасибо ещё раз.
Пршу прощения, редактирую Добавлено через 48 минут 15 секунд Вот, вопрос-то всё равно остался открытым. В это примере после считывания файла считывание продолжается не с того, места, на котором закончилось, а с начала, хотя файл НЕ БЫЛ закрыт
0
|
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
|
|
13.08.2009, 10:41 | 4 |
Ты же открываешь его два раза. функция fopen() возвращает указатель на структуру описывающую данный файл (FILE). Среди прочих элементов, в этой структуре, есть указатель на текущий элемент в файле, изначально, когда файл открывается, то он указывает на самое начало. функция getc() воздействует на указатель при чтении, увеличивая его на единицу, (только для той структуры, адрес которой передан ей в виде аргумента).
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||||||||||
13.08.2009, 10:50 | 5 | ||||||||||
На те, без закрытия:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
13.08.2009, 11:38 [ТС] | 6 |
А что, собственно говоря, смешного?
Мне необходимо считывать текстовый файл не символ за символом подряд, а в другом порядке. Поэтому 2 раза открываю. Используя один указатель, считываю с одного места, используя другой указатель- с другого места. ...Получается, знаете ли.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
13.08.2009, 11:48 [ТС] | 8 |
Ну, тут дело, наверное в затратах разных.
Смотреть, где код больше (и исходный и бинарный), где памяти больше расходуется. Я не разбираюсь в этом ещё пока. Кстати, для моей задачи функция fflush вряд ли подойдёт. Там так надо. Содержание файла такое примерно (то есть файл заполняется не программно, вот в чём дело. То есть fflush не подойдёт, наверное) "air almost any by fly for from gate" Словарь то есть. Вот считывать надо так: Считываем посимвольно первое слово и второе и сравниваем символы. Когда находим разные символы... далее по тексту. Так что тут именно надо два раза открыть его на чтение, потом считать первое слово (первым FILE*) а потом считывать посимвольно и сравнивать.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
13.08.2009, 11:52 | 9 |
kravam, на самом деле, затрат больше на открытие файлового дескриптора и работу с ними двумя, чем на просто сложение/вычитаение.
Если интересно будет потом, то почитай про функции lseek, fseek. А так, работает и ладно.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
13.08.2009, 17:13 | 10 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
13.08.2009, 21:29 [ТС] | 11 | |||||
Не, ну, так-то нет необходимости, я её решил. Мне осталось только разобраться, в том, что мне написали выше и проанализировать (щас пока некогда, не вникал ещё)
А вообще задача такая: Дан текстовый файл slovar.txt, представляющий из себя перечень слов (английских) в алфавитном порядке. Между словами- по одному пробелу, после последнего слова EOF Требуется "сжать" этот файл (создать другой файл *txt) по такому правилу: Допустим, слова такие: air almost any by fly for from gate Первое слово копируем полностью. Потом так. Смотрим сколько букв из второго слова совпадают с буквами из первого В данном случае 1 буква 'a' пишем 1, потом most. Получается air1lmost Потом смотрим на слова "almost" и "any". Ага, одна буква совпадает, пишем один и остаток слова "ny", уже получится air1lmost1ny И так до конца. Пробелы, естествено опускаем. В условии я и алгоритм рассказал почти весь. Вот мой код. Теперь пишу "расифровыватель"
Ребята, я напортачил с переменной i, она не нужна вообще.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
13.08.2009, 21:44 | 12 |
Тебе вообще не нужен fgetc() !
Прочитай весь файл в одну строку и работай со строкой. Это намного удобнее и быстрее, чем прыгать по файлу, да еще иметь несколько FILE *f1, *f2, *f3. Когда закодируешь строку - записывай в выходной файл все сразу.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
13.08.2009, 21:52 [ТС] | 13 |
Кстати, очень важный вопрос. Меня месяца 2 назад как торкнуло- так и делать, копируем файл в строку и с ней работаем, можно всяко изменять. Манёвренность действительно та ещё. НАвскидку- много удобнее, нежели работы с файлом
...Ну, а ВООБЩЕ это грамотный подход? Или каждый случай в отдельности рассматривать? Я сам учусь, ТАКИХ вещей спросить не у кого.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
13.08.2009, 21:58 | 14 |
Когда ты столкнешься со случаем, когда этого делать не нужно - ты УЗНАЕШЬ сам. Добавлено через 1 минуту 33 секунды Вообщем эту тему нужно закрывать. Если с задачей справился, то ничего делать не нужно Если не справился - заводить новую тему с другими вопросами
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
14.08.2009, 02:17 [ТС] | 15 | |||||
Да, всё так. Единственное неудобство- никогда не знаешь заранее длину файла. Придётся делать строку очень длинной, на всякий случай, чтобы весь файл туда влез.
Спасибо всем, тему можно закрывать. Добавлено через 3 часа 55 минут 11 секунд Нет, мне всё-таки одному не разобраться. Извините. Вот код из самого первого поста. Я его чуть-чуть изменил. Теперь он ещё выводит 2 значения- адреса структур, Так вот эти адреса разнятся. Предсказуемо? Вполне. Но я понять не могу, коль скоро адреса разнятся, chetnie_iz_faila не имеет НИКАКОГО отношения к zapis_v_fail. (Содержат разные адреса) А значит когда мы записали в файл символы, указатель на текущую позицию находится где-то там, в недрах структуры, соответствующей zapis_v_fail. Но каким-то образом этот указатель, находящийся в структуре, соттветствующей zapis_v_fail влияет на указатель, находящийся в абсолютно ДРУГОЙ структуре. (Это всё странно даже с учётом того, что файл zapis_v_fail не закрыт после записи. Ну, не закрыт- не закрыт, ведь начинается работа со совсем другой сруктурой)
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||
14.08.2009, 02:50 | 16 | |||||||||||||||
Когда ты открываешь файл и используешь fputc,то ты продвигаешь каждый раз указатель в связанном с файлом потоке.Когда ты открываешь его с fopen,то файл уже открыт,и возможно что он открывается с той же позиции указателя,которую установил fputc,а это значит,что файловый буфер у них общий.Попробуй сначала закрыть файл,а потом уже
Добавлено через 14 минут 5 секунд Попробуй перед открытием использовать функцию
А вычитал я это здесь http://www.cplusplus.com/refer... ry/cstdio/ То есть примерно так:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
14.08.2009, 02:51 [ТС] | 17 | |||||
Да... Вот именно, что "возможно что он открывается с той же позиции указателя,которую установил fputc"
А вот если осуществляем запись одним указатель на файл, а потом другим, а файл один и тот же, то ничего подобного не происходит. Вторая запись в файл начнётся сначала файла.
Только и остаётся, что пометить себе куда-нибудь и вызубрить. А почему так- непонятно. А с закрытием получится, да rewind, да... Спасибо, пойду учиться. Да хоть бы где-то подобную тонкость описали, а то у меня K&R, Стефан Кочан, ещё что-то. И нигде такое дело не оговорено.
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
14.08.2009, 03:00 | 18 |
Непонял,а в чём разница с примером выше ? ...А,понял,ты продолжаешь запись вместо чтения..Значит чтение-запись связаны особыми узами,и когда ты записываешь,а потом читаешь,то читаешь с того места,где записали последний раз.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
14.08.2009, 03:09 [ТС] | 19 |
Ну да. Так получается.
Просто и неохота людей беспокоить- форумчан то есть, но и НЕ СПРОСИТЬ НЕЛЬЗЯ. Потому и ругаюсь про себя на авторов книг.
0
|
14.08.2009, 03:09 | |
14.08.2009, 03:09 | |
Помогаю со студенческими работами здесь
19
Сканер считывает штрихкод и теряет первый символ Поменять местами первый и последний символ в первом слове Поменять местами первый и последний символ в первом слове Почему при чтении файла последний символ выводится 2 раза? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |