Все лекции программирование
.pdfПример
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main(void)
{
char str[80]; FILE *fp;
if((fp = fopen("test.txt", "w"))==NULL) { printf("Error.\n");
exit(1);
}
printf("Input 1 for exit.\n"); do {
scanf("%s",str); fflush(stdin); strcat(str, "\n"); fputs(str, fp);
} while(*str!='1');
return 0;
}
Другие функции
Функция rewind() устанавливает указатель текущей позиции в файле на начало файла, указанного в качестве аргумента этой функции. Иными словами, функция rewind() выполняет "перемотку" (rewind) файла. Вот ее прототип:
void rewind(FILE *fp);
Функция ferror() определяет, произошла ли ошибка во время выполнения операции с файлом. Прототип этой функции следующий:
int ferror(FILE *fp);
Она возвращает значение true (истина), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает false (ложь). Так как при любой операции с файлом устанавливается свое условие ошибки, то после каждой такой операции следует сразу вызывать ferror(), а иначе данные об ошибке могут быть потеряны.
Функция remove() стирает указанный файл. Ее прототип:
int remove(const char *имя_файла);
В случае успешного выполнения эта функция возвращает нуль, а в противном случае – ненулевое значение.
Для дозаписи содержимого выводного потока в файл применяется функция fflush(). Вот ее прототип:
int fflush(FILE *fp);
Эта функция записывает все данные, находящиеся в буфере в файл, который указан с помощью fp. При вызове функции fflush() с пустым (null) указателем файла fp будет выполнена дозапись во все файлы, открытые для вывода.
После своего успешного выполнения fflush() возвращает нуль, в противном случае – EOF.
Функции fread() и fwrite()
Для чтения и записи данных, тип которых может занимать более 1 байта, в файловой системе языка C имеется две функции: fread() и fwrite(). Эти функции позволяют читать и записывать блоки данных любого типа. Их прототипы следующие:
size_t fread(void *буфер, size_t колич_байт, size_t счетчик, FILE *fp); size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *fp);
Для fread() буфер – это указатель на область памяти, в которую будут прочитаны данные из файла. А для fwrite() буфер – это указатель на данные, которые будут записаны в файл. Значение счетчик определяет, сколько считывается или записывается элементов данных, причем длина каждого элемента в байтах равна колич_байт. (Тип size_t определяется как одна из разновидностей целого типа без знака.) И fp – это указатель файла, то есть на уже открытый поток.
Функция fread() возвращает количество прочитанных элементов. Если достигнут конец файла или произошла ошибка, то возвращаемое значение может быть меньше, чем счетчик. А функция fwrite() возвращает количество записанных элементов. Если ошибка не произошла, то возвращаемый результат будет равен значению счетчик.
#include <stdio.h> #include <stdlib.h>
int main(void)
{
FILE *fp;
double d = 12.23; int i = 101;
long l = 123023L;
if((fp=fopen("test", "wb+"))==NULL) { printf("Error.\n");
exit(1);
}
fwrite(&d, sizeof(double), 1, fp); fwrite(&i, sizeof(int), 1, fp); fwrite(&l, sizeof(long), 1, fp);
rewind(fp);
fread(&d, sizeof(double), 1, fp); fread(&i, sizeof(int), 1, fp); fread(&l, sizeof(long), 1, fp);
printf("%f %d %ld", d, i, l); fclose(fp);
return 0;
}
Пример
c:\>Example.exe 12.230000 101 123023
Пример
void save(void)
{
FILE *fp; register int i;
if((fp=fopen("maillist", "wb"))==NULL) { printf("Ошибка при открытии файла.\n"); return;
}
for(i=0; i<MAX; i++) if(*addr_list[i].name)
if(fwrite(&addr_list[i], sizeof(struct addr), 1, fp)!=1)
printf("Ошибка при записи файла.\n");
fclose(fp);
}
void load(void)
{
FILE *fp; register int i;
if((fp=fopen("maillist", "rb"))==NULL) { printf("Ошибка при открытии файла.\n"); return;
}
init_list();
for(i=0; i<MAX; i++) if(fread(&addr_list[i],
sizeof(struct addr), 1, fp)!=1) { if(feof(fp)) break;
printf("Ошибка при чтении файла.\n");
}
fclose(fp);
}
Функция fseek()
При прямом доступе можно выполнять операции ввода/вывода, используя систему ввода/вывода языка C и функцию fseek(), которая устанавливает указатель текущей позиции в файле. Вот прототип этой функции:
int fseek(FILE *fp, long int колич_байт, int начало_отсчета);
Здесь fp – это указатель файла, возвращаемый в результате вызова функции fopen(), колич_байт – количество байтов, считая от начало_отсчета, оно определяет новое значение указателя текущей позиции, а начало отсчёта - это один из следующих макросов:
Начало отсчета |
Макрос |
Начало файла |
SEEK_SET |
Текущая позиция |
SEEK_CUR |
Конец файла |
SEEK_END |
Пример
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
if(argc!=3) {
printf("Arguments must be correct.\n"); exit(1);
}
if((fp = fopen(argv[1], "rb"))==NULL) { printf("Error.\n");
exit(1);
}
if(fseek(fp, atol(argv[2]), SEEK_SET)) { printf("Seek error.\n");
exit(1);
}
printf("%ld byte is %c.\n", atol(argv[2]), getc(fp)); fclose(fp);
return 0;
}
Функции fprinf() и fscanf()
Кроме основных функций ввода/вывода, о которых шла речь, в системе ввода/вывода языка C также имеются функции fprintf() и fscanf(). Эти две функции, за исключением того, что предназначены для работы с файлами, ведут себя точно так же, как и printf() и scanf(). Прототипы функций fprintf() и fscanf() следующие:
int fprintf(FILE *fp, const char *управляющая_строка, ...); int fscanf(FILE *fp, const char *управляющая_строка, ...);
где fp – указатель файла, возвращаемый в результате вызова fopen().
#include <stdio.h> #include <io.h> #include <stdlib.h>
int main(void)
{
FILE *fp; char s[80]; int t;
if((fp=fopen("test", "w")) == NULL) { printf("Error.\n");
exit(1);
}
printf("Input string and number: "); fscanf(stdin, "%s%d", s, &t);
fprintf(fp, "%s %d", s, t); fclose(fp);
if((fp=fopen("test","r")) == NULL) { printf("Error.\n");
exit(1);
}
fscanf(fp, "%s%d", s, &t); fprintf(stdout, "%s %d", s, t); return 0;
}
Пример
c:\>Example.exe
Input string and number: dafdfadf 5 dafdfadf 5
Лекция 11. Алгоритмы