Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Все лекции программирование

.pdf
Скачиваний:
26
Добавлен:
13.03.2016
Размер:
1.94 Mб
Скачать

Пример

#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. Алгоритмы