
Контрольные вопросы
Что такое файл с точки зрения информатики и вычислительной техники?
Что такое файл с точки зрения языка программирования С?
Какие виды файлов Вы знаете?
В чем отличие текстового файла от бинарного и от чего это зависит наличие этого различия?
Что такое поток?
Что такое признак окончания файла? Для каких файлов он существует?
Как инициализировать поток?
Что такое структурный тип?
Какая функция отвечает за открытие потока? Какие у нее параметры?
Какие режимы открытия файла Вы знаете? В чем их отличия друг от друга?
Какие ошибки могут возникнуть при открытии файла?
В каком случае указатель на поток принимает значение NULL?
Какая функция отвечает за закрытие файла? Какие у нее параметры?
Зачем закрывать файл?
Сколько раз можно открыть файл в программе?
Какие функции используются для ввода-вывода данных при работе с текстовыми файлами?
Какие функции используются для ввода-вывода данных при работе с бинарными файлами?
В чем отличие функции fprintf() от функции fread(), а функции fscanf() от fwrite()?
Как определить текущую позицию указателя на поток?
Как переместить указатель на поток из текущей позиции в заданную?
За что отвечает константа EOF? Как и где ее можно использовать?
Какие основные функции для работы с файлами Вы знаете?
С помощью каких функций можно осуществлять побайтовую обработку файлов?
Для чего используются функции rename() и remove()? Нужно ли при работе с ними объявлять файловый указатель?
Можно ли удалить или переименовать открытый файл?
ПРИЛОЖЕНИЕ 1
Примеры обработки текстовых и бинарных файлов
Пример 1. Побайтовая обработка файлов с использованием функций getc() и putc(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (кодовая страница (code page) OEM 866).
Он же показывает, чем отличаются текстовые и двоичные файлы в Windows XP.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char alphabet[]="ABXZ";
char buf[100];
int i=-100;
int rdint=-1;
int abcount = 0;
{
int i=0;
memset(buf,0,100);
while(alphabet[i])
buf[i]=alphabet[i++];
abcount = i;
}
printf("i = %d abcount = %d\n",i,abcount);
fp = fopen("file1.dat","w"); /* открываем файл как текстовый, создаваемый
заново и доступный только для записи */
if(fp != NULL)
{
printf("after fopen() fp = %p \n",fp);
for(i=0; i < abcount; i++)
putc(buf[i], fp);
putc('\0', fp); /* Символ '\0' записан в текстовый файл без изменений:
1 байт, его шестнадцатеричное значение 00 */
putc('\n', fp); /* Вместо символа '\n' (перевод строки) в текстовый файл
записана последовательность из двух байт: в шестнадцатеричном представлении: 0D 0A в десятичном представлении: 13 10 обозначения: CR LF – Возврат_Каретки Перевод_Строки */
putc('z', fp);
putc('\r', fp); /*Одиночный символ '\r' (Возврат_Каретки)
записан в ТЕКСТОВЫЙ файл без изменений:
1 байт, его шестнадцатеричное значение 0D */
putc('a', fp);
}
fclose(fp);
printf("after fclose() fp = %p \n",fp);
system("PAUSE");
fp = fopen("file2.txt","wbsdgfrtg"); /* открываем файл, указывая признак
бинарного файла – буква "b" после указания собственно режима. То есть требуется обрабатывать внешний файл как бинарный файл, создаваемый заново и доступный только для записи. Все дополнительные символы после b в строке режима игнорируются*/
if(fp != NULL)
{
for(i=0; i < abcount; i++)
putc(buf[i], fp);
putc('\0', fp); /* Символ '\0' записан в бинарный файл без изменений:
1 байт, его шестнадцатеричное значение 00*/
putc('\n', fp); /* Cимвол '\n' записан в бинарный файл без изменений:
1 байт, его шестнадцатеричное значение 0A
десятичное представление: 10
обозначение: LF – Перевод_Строки (также встречается
обозначение NL – Новая_Строка) */
putc('z', fp);
putc('\r', fp); /*Одиночный символ '\r' (Возврат_Каретки)
записан в бинарный файл без изменений:
1 байт, его шестнадцатиричное значение 0D */
putc('a', fp);
}
fclose(fp);
system("PAUSE");
system("CLS");
printf("Read chars from file1.dat, open as text:\n");
fp = fopen("file1.dat","r");
if(fp != NULL)
{
while( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
}
fclose(fp);
printf("Read chars from file1.dat, open as binary:\n");
fp = fopen("file1.dat","rb");
if(fp != NULL)
{
while( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
}
fclose(fp);
system("PAUSE");
system("CLS");
printf("Read chars from file2.txt, open as text:\n");
fp = fopen("file2.txt","rt");
if(fp != NULL)
{
while( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
}
fclose(fp);
printf("Read chars from file1.dat, open as binary:\n");
fp = fopen("file2.txt","rb");
if(fp != NULL)
{
while( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
}
fclose(fp);
system("PAUSE");
return 0;
}
Пример 2. Поблочная обработка файлов с использованием функций fread() и fwrite(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (code page OEM 866).
Во-вторых, с помощью функций прямого ввода можно также работать как с текстовыми, так и с двоичными файлами –. И этот пример показывает, что при прямой записи в файл, открытый как текстовый, и прямом чтении из файла, открытого как текстового, происходят те же преобразования, что и при посимвольной работе с файлом. Точно такие же преобразования происходят и при построчной работе с текстовыми файлами в системах, делающих различие между двоичными и текстовыми файлами.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char alphabet[]="ABCD";
char buf[100], buf2[100];
int i=-100;
int rdint=-1;
int abcount = 0;
{
int i=0;
memset(buf,-1,100);
while(alphabet[i])
buf[i]=alphabet[i++];
buf[i++] = '\0';
buf[i++] = '\n';
buf[i++] = 'Z';
buf[i++] = '\r';
buf[i++] = 'U';
abcount = i;
}
printf("i = %d abcount = %d\n",i,abcount);
fp = fopen("file1.dat","w");
if(fp != NULL)
{
printf("after fopen() fp = %p \n",fp);
printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 4, fp));
system("PAUSE");
fclose(fp);
}
printf("after fclose() fp = %p \n",fp);
system("PAUSE");
fp = fopen("file2.txt","wb"); /* открываем файл как бинарный, создаваемый
заново и доступный только для записи */
if(fp != NULL)
{
printf("after fopen() fp = %p \n",fp);
printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 4, fp));
system("PAUSE");
fclose(fp);
}
system("PAUSE");
system("CLS");
memset(buf,-1,100);
printf("Read abcount+4 bytes from file1.dat to buf2, open as text:\n");
fp = fopen("file1.dat","r");
if(fp != NULL)
{
printf("From file1.dat to buf2 as text: fread() = %d",
fread(buf2,1,abcount + 4, fp));
for(i = 0; i < abcount + 4; i++)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
buf2[i], buf2[i], (char)(buf2[i]));
}
fclose(fp);
memset(buf,-1,100);
printf("Read abcount+4 bytes from file1.dat to buf2, open as binary:\n");
fp = fopen("file1.dat","rb");
if(fp != NULL)
{
printf("From file1.dat to buf2 as binary: fread() = %d",
fread(buf2,1,abcount + 4, fp));
for(i = 0; i < abcount + 4; i++)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
buf2[i], buf2[i], (char)(buf2[i]));
}
fclose(fp);
system("PAUSE");
system("CLS");
memset(buf,-1,100);
printf("Read abcount+4 bytes from file2.txt to buf2, open as text:\n");
fp = fopen("file2.txt","rt");
if(fp != NULL)
{
printf("From file2.txt to buf2 as text: fread() = %d",
fread(buf2,1,abcount + 4, fp));
for(i = 0; i < abcount + 4; i++)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
buf2[i], buf2[i], (char)(buf2[i]));
}
fclose(fp);
memset(buf,-1,100);
printf("Read abcount+4 bytes from file2.txt to buf2, open as binary:\n");
fp = fopen("file2.txt","rb");
if(fp != NULL)
{
printf("From file2.txt to buf2 as binary: fread() = %d",
fread(buf2,1,abcount + 4, fp));
for(i = 0; i < abcount + 4; i++)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
buf2[i], buf2[i], (char)(buf2[i]));
}
fclose(fp);
system("PAUSE");
return 0;
}
Пример 3. Использование функции fseek(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (code page OEM 866).
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char alphabet[]="ABCDEF";
char buf[100];
int i=-100;
int rdint=-1;
int abcount = 0;
{
int i=0;
memset(buf,-1,100);
while(alphabet[i])
buf[i]=alphabet[i++];
buf[i++] = '\0';
buf[i++] = '\n';
buf[i++] = 'Z';
buf[i++] = '\r';
buf[i++] = 'U';
abcount = i;
}
printf("i = %d abcount = %d\n",i,abcount);
fp = fopen("file1.dat","w");
if(fp != NULL)
{
printf("after fopen() fp = %p \n",fp);
printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 1, fp));
system("PAUSE");
fclose(fp);
}
printf("after fclose() fp = %p \n",fp);
system("PAUSE");
fp = fopen("file2.txt","wb"); /* открываем файл, указывая
признак бинарного файла – буква "b" в конце строки режима доступа, после указания собственно режима. То есть требуется обрабатывать внешний файл как "бинарный файл", создаваемый заново и доступный только для записи*/
if(fp != NULL)
{
printf("after fopen() fp = %p \n",fp);
printf("In binary file: fwrite() = %d",fwrite(buf,1,abcount, fp));
system("PAUSE");
fclose(fp);
}
printf("file1.dat as text:\n");
fp = fopen("file1.dat","r+");
if(fp != NULL)
{
printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
system("PAUSE");
fclose(fp);
}
printf("file1.dat as binary:\n");
fp = fopen("file1.dat","r+b");
if(fp != NULL)
{
printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
system("PAUSE");
fclose(fp);
}
printf("file2.dat as text:\n");
fp = fopen("file2.txt","r+");
if(fp != NULL)
{
printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
system("PAUSE");
fclose(fp);
}
printf("file2.txt as binary:\n");
fp = fopen("file2.txt","r+b");
if(fp != NULL)
{
printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, 5, SEEK_CUR) = %d\n",
fseek(fp, 5, SEEK_CUR));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));
if( (rdint = getc(fp)) != EOF)
printf("Readed code as decimal: %3d as hex:
%02x As char: %c _*+*+*_ \n",
rdint, rdint, (char)rdint);
system("PAUSE");
fclose(fp);
}
return EXIT_SUCCESS;
}