Закрытие файла fclose()
Открытие файла fopen()
ФАЙЛ
Язык Си "рассматривает" файл как структуру. В stadio.h содержится определение структуры файла. Определен шаблон и директива препроцессора #defile FILE struct iobuf
FILE краткое наименование шаблона файла. Некоторые системы используют директиву typedef для установления этого соответствия.
typedef struct iobuf FILE
Функцией управляют три параметра.
FILE *in; //указатель потока
Для связывания указателя с файлом служит функция открытия файла fopen(), которая объявлена в заголовочном файле <stdio.h>.
in = fopen("test", "r");
1 параметр - имя открываемого файла
2 параметр -
"r"-по чтению "r+"-чтение и запись
"w"-по записи "w+"-запись и чтение, если файл уже был, он перезаписываетя
"a"-дозапись "a+"-чтение и дозапись, если файла еще не было, он создается
"b"-двоичный файл
"t"-текстовый файл
in является указателем на файл "test". Теперь будем обращаться к файлу через этот указатель.
Если файл не был открыт (его нет, нет места на диске), то возвращается в указатель 0.
if((in=fopen("test", "r"))==0)
puts("Ошибка открытия файла");
Можно по другому
in=fopen("test", "r");
if (!in)
puts("Ошибка открытия файла");
fclose(FILE *stream); //Если файл закрыт успешно, то возвращается 0 иначе -1.
19.3 Функции ввода/вывода одного символа fgetc(), fputc()
1. Чтение из файла посимвольно
int fgetc(FILE *stream);
2. Запись в файл посимвольно
int fputc(int c, FILE *stream);
Код этого же символа и возвращается.
ch=fgetc(in);
fputc(ch,out);
# include <stadio.h>
void main(void){
FILE *in,*out;
char ch;
if((in=fopen("prog1", "r"))==0)
fputs("Ошибка открытия prog1");
if((out=fopen("prog2", "w"))==0)
fputs("Ошибка открытия prog2);
while((ch=getc(in))!=EOF) //”End Оf File” константа определенная в dos.h
fputc(ch, out);
fclose(in);
fclose(out);
}
19.4 Функции форматированного ввода/вывода в файл
1. Форматированный вывод в текстовый файл
int fprintf(FILE *stream,”управл.cтрока”,arg1,…)
Возвращает количество записанных байтов.
2. Форматированный ввод из текстового файла
int fscanf(FILE *stream,”управл.cтрока”,&arg1,…)
Возвращает количество прочитанных байтов.
# include<stadio.h>
void main(void){
FILE*in;
int age;
in=fopen("prog1", "r");
fscanf(in,"%d",&age);
fclose(in);
in=fopen("prog2", "w");
fprintf(in,"число %d\n",age);
fclose(in);
}
Модификаторы и спецификаторы, те же, что и в printf().
19.5 Функции ввода/вывода строки символов в файл
1. Чтение текстовой строки из файла.
char* fgets(char *str, int n, FILE *stream);
Читает до перевода строки или n-1 байт и к концу строки присоединяет 0 байт, если прочитан \n.
void main(void){
FILE*in;
char string[80];
in=fopen("story", "r");
while(fgets(string,80, in)!=0)
puts(string);
}
Считывается до конца строки '\n' или 80-1 байт. При встрече EOF возвращает 0.
2. Запись текстовой строки в файл
int fputs(char *str,FILE *stream);
y=fputs(“Это строка”,in);
y-целое число, которое устанавливается в EOF, если fputs() встре-чает EOF или ошибку. fputs не добавляет '\n' в конeц строки.
Все эти функции работают с текстовыми файлами и называются функциями последовательного доступа к файлу. Указатель внутри файла перемещается автоматически при чтении или записи.
Существуют функции прямого доступа к файлу.
Функция позволяет работать с файлом как с массивом. Достигать любого байта.
int fseek(FILE *stream, смещение, start)
Возвращает число типа int:
0 - если все хорошо;
-1 - ошибка.
Смещение – это количество байт на которое нужно сместить указатель по файлу с +(вперед), -(назад);
start - код начальной точки:
SEEK_SET или 0 – от начала файла;
SEEK_END или 2 – от конца файла;
SEEK_CUR или 1 – от текущего положения курсора.
fseek(in,0,0) - установить курсор на начало файла.
long int ftell(FILE *stream) - возвращает текущее положение курсора в файле.
19.7 Ввод/вывод записей фиксированной длины
Под записью фиксированной длины можно понимать размер элемента массива или структуры.
1. Чтение данных из двоичного файла.
int fread(void *ptr, size type, size n, FILE *stream)
void *ptr – адрес массива, куда записываются данные;
size type – размер типа в байтах;
size n – количество данных;
FILE *stream – указатель на файл.
void main(void){
struct STOK record;
FILE *in;
in=fopen("data", "r");
int n=fread(&record, sizeof(record), 1, in);
}
Возвращает число считанных записей или EOF.
void main(void){
float mas[100];
FILE *in;
In=fopen("data", "rb");
fread(mas, sizeof(mas), 1, in);
} //можно так - fread(mas, sizeof(float), 100, in);
2. запись данных в двоичный файл.
int fwrite(void *ptr, size type, size n, FILE *stream)
Возвращает число записанных байт.
void *ptr – адрес массива, куда записываются данные;
size type – размер типа в байтах;
size n – количество данных;
FILE *stream – указатель на файл.
fwrite(mas, sizeof(mas), 1, in);
Пример 1. Запись во временный файл и чтение из него в массив.
#include <stdio.h>
#include <stdlib.h>
void main(void) {
int array[100];
//создать временный файл
FILE *tempf=tmpfile();
if(!tempf) {
puts(“нельзя открыть временный файл”);
exit(1);
}
for(int index=0; index<100; index++)//пишем в файл
fwrite(array,sizeof(int),1,tempf);
rewind(tempf); //указатель вернуть на начало
fread(array,sizeof(int),100,tempf);
rmtmp(); //закрыть и уничтожить временный файл
}
Пример 2. Проверить конец файлового потока
void main(void) {
int buff[100];
FILE *fp;
fp=fopen(“prog.txt”,”r”);
if(!fp) {
puts(“нельзя открыть файл”);
}
else {
while(!feof(fp))
if(fgets(buff,100,fp)!=NULL)
fputs(buff,stdout);
fclose(fp);
}
}