Печать содержимого файла с использованием getc и putc
Я видел, что этот вопрос уже задавался, но ни один из ответов не помог мне.
Я пытаюсь написать функцию, которая будет читать содержимое файла и распечатывать его. Вот мой код;
int main()
{
int c;
fseek(stdin, 0, SEEK_SET);
c = getc(stdin);
while ((c = getchar()) != EOF)
{
putchar(c);
fseek(stdin, 1, SEEK_CUR);
c = getc(stdin);
}
}
При запуске кода я передаю в файл с помощью;
./[Program] < [File.txt]
например.
./FileRead < Hello.txt
Однако, когда я запускаю его, я получаю путаницу случайных букв. Вот пример:
Содержимое файла, в который я отправляю:
Привет, мир!
Это тестовый файл.
Я надеюсь, что это работает!
И вот вывод:
ЕООД
Тсс сфе
IO IWK
Может кто-нибудь помочь мне понять, что не так?
1 ответ
Просто отметим, что функция getc() автоматически перемещает активный указатель файла на следующую позицию после чтения символа, поэтому
//fseek(stdin, 0, SEEK_SET);
открывает файл и устанавливает указатель на первый символ
//c = getc(stdin);
//getc() получает следующий символ в строке 'H' и перемещает указатель вперед на один символ c сейчас == 'H'
while ((c = getchar()) != EOF)
//getchar()
швы должны работать (не рекомендуется) при чтении из файла попробуйте использовать
//getc(<filepointer>)
c теперь == 'e' и указатель файла перемещен в первый 'l'.
Тогда у вас есть
//putchar(c)
который печатает символ "е"
//fseek(stdin, 1, SEEK_CUR);
Перемещает *fp вперед на один символ ко второму 'l'
Тогда у вас есть // c = getc(stdin);
Прочитайте следующий символ в строке, который является вторым 'l', переместите *fp в пробел '' и повторите.
В основном измените код на это:
while ((ch = getch(stdin)) != EOF)
{
putchar(c);
}
Код должен работать нормально.
Примечание. Для потоков, открытых в текстовом режиме, fseek и _fseeki64 имеют ограниченное использование, поскольку переводы каретки и перевода строк могут привести к неожиданным результатам для fseek и _fseeki64. Единственные операции fseek и _fseeki64operations, которые гарантированно работают с потоками, открытыми в текстовом режиме:
• Поиск со смещением 0 относительно любого исходного значения.
• Поиск в начале файла со значением смещения, возвращаемым из вызова ftell при использовании fseekor _ftelli64 при использовании_fseeki64.