Печать содержимого файла с использованием 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.

Другие вопросы по тегам