Примеры программ к Лабораторной работе N7. "Работа с файлами"
/* addaword.c - использование функций fprintf(), fscanf() и rewind() */
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
int main (int argc, char * argv[])
{
FILE *fp;
char words[MAX];
/* if ((fp = fopen("./words", "а+")) == NULL)
{
fprintf(stdout, "He удается открыть файл \"words\".\n");
exit(1) ;
} */
if ((fp = fopen(argv[1], "a+")) == NULL)
{
fprintf(stdout, "He удается открыть файл \"words\".\n");
exit(1) ;
}
puts("Введите слова, которые нужно включить в файл; нажмите клавишу Enter ");
puts("в начале строки для завершения программы.");
while(gets(words) != NULL && words[0] != '\0')
fprintf(fp, "%s", words);
puts("Содержимое файла:");
rewind(fp); /* вернуться в начало файла */
while(fscanf(fp, "%s", words) == 1)
puts(words);
if(fclose(fp) != 0)
fprintf(stderr, "Ошибка при закрытии файла\n");
return 0;
}
/* append.c - добавление содержимого файлов в конец другого файла */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 1024
#define SLEN 81
void append(FILE * source, FILE * dest);
int main (void)
{
FILE *fa, *fs; // fa для файла назначения, fs для исходного файла
int files = 0; // количество добавляемых файлов
char file_app[SLEN]; // имя файла назначения
char file_src[SLEN]; // имя исходного файла
puts("Введите имя файла назначения: ");
gets(file_app);
if ((fa = fopen(file_app,"a")) == NULL)
{
fprintf(stderr, "Не удается открыть файл 1 %s\n", file_app);
exit(2);
}
if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0){
fputs ("He удается создать буфер вывода \n", stderr);
exit(3) ;
}
puts("Введите имя первого исходного файла (или пустую строку для завершения): ");
while(gets(file_src) && file_src[0] != '\0')
{
if(strcmp(file_src, file_app) == 0)
fputs ("Нельзя добавлять файл в конец самого ceбя\n" , stderr);
else if ((fs = fopen(file_src,"r")) == NULL)
fprintf(stderr, "Не удается открыть файл %s\n" , file_src);
else {
if( setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0 ) {
fputs ("He удается создать буфер ввoдa\n", stderr);
continue;
}
append(fs, fa);
if(ferror(fs) != 0)
fprintf(stderr, "Ошибка во время чтения файла %s.\n", file_src);
if(ferror(fa) != 0)
fprintf(stderr, "Ошибка во время записи в файл %s.\n", file_app);
fclose(fs);
files++;
printf("Фaйл %s добавлен.\n", file_src);
puts("Введите имя следующего файла (или пустую строку для завершения): ");
}
}
printf("Гoтoвo. Добавлено %d файлов.\n", files);
fclose(fa);
return 0;
}
void append(FILE * source, FILE * dest)
{
size_t bytes;
static char temp[BUFSIZE]; // распределить один раз
while((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0)
fwrite(temp, sizeof(char), bytes, dest);
}
/* count_symb.c - использование стандартного ввода-вывода */
#include <stdio.h>
#include <stdlib.h> // прототип ANSI С функции exit()
int main (int argc, char * argv[])
{
int ch; // место, куда помещается каждый символ в том виде, в каком он был прочитан
FILE *fp; // "указатель на файл"
long count = 0;
if (argc != 2) {
printf("Использование: %s filename\n", argv [0]);
exit(1);
}
if((fp = fopen(argv[1], "r")) == NULL) {
printf("He удается открыть %s\n", argv[1]);
exit(1);
}
while((ch = getc(fp)) != EOF ) {
putc(ch, stdout); // то же, что и putchar(ch);
count++;
}
fclose(fp);
printf("\nФaйл %s содержит %ld символов\n", argv[1], count);
return 0;
}
/* parrot.c - использование функций fgets() и fputs() */
#include <stdio.h>
#define MAXLINE 20
int main (void)
{
char line[MAXLINE];
while(fgets(line, MAXLINE, stdin) != NULL && line[0] != '\n')
fputs(line, stdout);
return 0;
}
/* randbin.c - произвольный доступ, двоичный ввод-вывод */
#include <stdio.h>
#include <stdlib.h>
#define ARSIZE 1000
int main(void)
{
double numbers[ARSIZE];
double value;
const char *file = "numbers.dat";
int i;
long pos;
FILE *iofile;
// создать набор значений типа double
for( i=0; i < ARSIZE; i++)
numbers[i]=(double)rand()/1000000;
// попытка открыть файл
if ((iofile=fopen(file,"wb")) == NULL )
{
fprintf(stderr,"Не удается открыть %s для вывода.\n",file);
exit(1);
}
// записать массив в двоичном формате в файл
fwrite(numbers, sizeof(double), ARSIZE, iofile);
fclose(iofile);
if ((iofile=fopen(file,"rb")) == NULL )
{
fprintf(stderr,"Не удается открыть %s для произвольного доступа.\n", file);
exit(1);
}
// чтение избранных элементов из файла
printf("Bвeдитe индекс из диапазона от 0 до %d.\n", ARSIZE-1);
scanf("%d",&i);
while( i>=0 && i < ARSIZE )
{
pos=(long)i*sizeof(double); // вычислить смещение
fseek(iofile, pos, SEEK_SET); // перейти в эту позицию
fread(&value, sizeof(double), 1, iofile);
printf("B этом случае значение равно %f.\n", value);
printf("Bвeдитe следующий индекс (или значение за пределами диапазона для завершения):\n");
scanf("%d", &i);
}
// завершение программы
fclose(iofile);
puts("Bceгo доброго!");
return 0;
}
// reducto.c - сжимает ваши файлы до одной трети первоначальных размеров!
#include <stdio.h>
#include <stdlib.h> // для функции exit()
#include <string.h> // для функций strcpy(), strcat()
#define LEN 40
int main (int argc, char * argv[])
{
FILE * in, * out; // объявление двух указателей на FILE
int ch ;
char name[LEN]; // хранилище для имени выходного файла
int count = 0;
// проверка аргументов командной строки
if (argc < 2) {
fprintf(stderr, "Использование: %s filename\n", argv[0]);
exit (1);
}
// настройка ввода
if((in = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Не удается открыть файл \"%s\"\n", argv[1]);
exit(2);
}
// настройка вывода
strncpy(name, argv[1], LEN - 5); // копирование имени файла
name[LEN - 5] = '\0';
strcat(name, ".red"); // добавить суффикс .red
if((out = fopen(name, "w")) == NULL ){
// открыть файл для записи
fprintf(stderr, "Не могу построить выходной файл.\n");
exit(3);
}
// копирование данных
while((ch = getc(in)) != EOF)
if(count++ % 3 == 0)
putc(ch, out); // печатать каждый третий символ
// очистка
if(fclose(in) != 0 || fclose(out) != 0)
fprintf(stderr, "Oшибкa при закрытии файла\n");
return 0;
}
/* reverse.c - отображение файла в обратном порядке */
#include <stdio.h>
#include <stdlib.h> // для функции exit()
#define CNTL_Z '\032' /* маркер конца файла в текстовых файлах DOS */
#define SLEN 50
int main (void)
{
char file[SLEN] ;
char ch ;
FILE *fp;
long count, last;
puts("Введите имя файла для обработки: ");
gets(file);
if ((fp = fopen(file,"rb")) == NULL)
{ /* режим только чтения и двоичный режим */
printf("Пpoгpaммa reverse не может открыть %s\n", file);
exit(1);
}
fseek(fp, 0, SEEK_END); /* перейти в конец файла */
last = ftell(fp);
for (count = 1; count <= last; count++)
{
fseek(fp, -count, SEEK_END); /* вернуться */
ch = getc(fp);
/* для DOS, работает в Unix */
if(ch != CNTL_Z && ch != '\r')
putchar(ch);
}
putchar('\n');
fclose(fp);
return 0;
}
/* test_mass.c - использование указателей */
#include <stdio.h>
int mass_func(int (*ptr_A)[2]){
printf("a[0][0]=%d\n",*(*(ptr_A + 1) + 0));
printf("a[1][1]=%d\n",ptr_A[1][1]);
return 0;
}
int test_func(int row, int column, int a[row][column]){
return 0;
}
int main(void)
{
int a[2][2]={{1,2},{3,4}};
int (*pa)[2];
pa=a;
int c = 5;
int *c_ptr;
c_ptr = &c;
printf("c=%d\n",*c_ptr);
printf("addr of c=%p\n", c_ptr);
mass_func(pa);
return 0;
}