Интернет магазин китайских планшетных компьютеров



Компьютеры - Файловый ввод/вывод в языке Си - Закрытие потока при помощи fclose

23 января 2011
карты на топливо

Оглавление:
1. Файловый ввод/вывод в языке Си
2. Открытие файла при помощи fopen
3. Закрытие потока при помощи fclose
4. fwrite
5. Запись в поток при помощи fputc



Психотерапевт Пермь

Функция fclose принимает один аргумент: указатель на структуру FILE потока для закрытия.

int fclose;

Функция возвращает нуль в случае успеха и EOF в случае неудачи. При нормальном завершении программы функция вызывается автоматически для каждого открытого файла.

Чтение из потока

при помощи fgetc

Функция fgetc применяется для чтения символа из потока.

int fgetc;

В случае успеха, fgetc возвращает следующий байт или символ из потока. В противном случае, fgetc возвращает EOF.

Стандартный макрос getc также определен в <stdio.h>, успешно работая как fgetc, кроме одного: будучи макросом, он может обрабатывать свои аргументы более одного раза.

Стандартная функция getchar также определена в <stdio.h>, она не принимает аргументов, и эквивалентна getc.


«Ловушка» EOF

Распространенной ошибкой является использование fgetc, getc или getchar для присваивания результата переменной типа char перед сравнением его с EOF. Следующий фрагмент кода демонстрирует эту ошибку, а рядом приведен корректный вариант:

Ошибка Правильно
char c;
while ) != EOF) {
    putchar;
}
int c;
while ) != EOF) {
    putchar;
}

Нужно учитывать систему, в которой тип char, длина которого составляет 8 бит, представляет 256 различных значений. getchar может возвращать любой из 256 возможных символов, а также может возвращать EOF для обозначения конца файла, значение которого не может совпадать ни с одним из значений char.

Когда результат getchar присваивается переменной типа char, которая может представить лишь 256 различных значений, происходит вынужденная потеря информации — при сжатии 257 значений в 256 «мест» происходит коллизия. Значение EOF при конвертации в char становится неотличимым от любого из остальных 256 символов. Если этот символ обнаружен в файле, код, приведенный выше, может принять его за признак конца файла, или, что еще хуже, если тип char — беззнаковый, тогда с учетом того, что EOF — значение отрицательное, оно никогда не сможет стать равным любому беззнаковому char, и таким образом, пример выше не закончится на метке конца файла, а будет выполняться вечно, повторно печатая символ, получающийся при конвертации EOF в char.

В системах, где int и char одинакового размера, даже «правильный» вариант будет работать некорректно из-за сходства EOF и другого символа. Правильным вариантом обработки подобной ситуации является проверка feof и ferror после того, как getchar вернет EOF. Если feof определит, что конец файла еще не достигнут, а ferror «сообщит», что ошибок нет, то EOF, возвращенный getchar может считаться текущим символом. Такие дополнительные проверки делаются редко, так как большинство программистов считает, что их код никогда не будет выполняться на подобных системах с «большим char». Другой способ состоит в использовании проверки при компиляции, что UINT_MAX > UCHAR_MAX, которая хотя бы предотвратит компиляцию на подобных системах.

при помощи fgets

Функция fgets применяется для чтения строки из потока. Считывание происходит до тех пор пока не будет достигнут конец строки или длина строки, в которую происходит считывание. Предположим, у нас есть файл some_file.txt с текстом

палиндромы
    А в Енисее - синева.
    А лама мала.
    А лис, он умен - крыса сыр к нему носила.
#include <stdio.h>
#include <string.h>
 
int main       /* argc хранит количество параметров, а argv указатели на эти параметры. 
                                        Например, если мы запустим исполняемый файл "fgets_example param1 param2", то argc будет равно 3, а argv = {"fgets_example", "param1", "param2"}*/
{
 
        FILE *file; 
        char *fname = "some_file.txt";
        char result_sting; //Строка в 20 символов
 
        file = fopen;
 
        if
        {
                printf;
                return 0;
        }
 
 
        int i=0;
        char *real_tail;
 
        while,file))
        {
                real_tail="";
                printf);
 
                if-1] == '\n')//проверяем является ли последний элемент в строке символом ее окончания
                {
                        real_tail="\\n";
                        result_sting='\0';
                };// эта часть кода добавлена лишь для отображения символа конца строки в консоль без перевода на новую строку 
                printf;
        }
 
        fclose;
 
return 0;
}

в результате выполнения мы получим

Строка 0:Длина строки - 11:палиндромы\n
Строка 1:Длина строки - 19:    А в Енисее - си
Строка 2:Длина строки - 6:нева.\n
Строка 3:Длина строки - 17:    А лама мала.\n
Строка 4:Длина строки - 19:    А лис, он умен
Строка 5:Длина строки - 19:- крыса сыр к нему
Строка 6:Длина строки - 19:носила. (И. Бабицки
Строка 7:Длина строки - 2:й)

Функция strlen определяет длину строки по количеству символов до '\0' так например

printf); //выведет 4


Просмотров: 10255


<<< Стандартные потоки
Мультимедиа >>>