Примеры программ к Лабораторной работе 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;
}