|
|
|
|
ЛАБОРАТОРНАЯ №5 ВАРИАНТ 6
| Задача: Открыть заданный текстовый файл и записать все его строки в двоичный файл
записей переменной длины (каждая строка записывается в виде записи из двух
полей [длина][содержимое]). После чего необходимо открыть созданный файл
и вывести его содержимое на экран. Имя входного (текстового) файла
задается в виде аргумента командной строки. Имя выходного (двоичного) файла
генерируется программой: он должен иметь то же имя, что и входной, но другое
расширение - “.bin”
Запись двоичного файла и его чтение реализовать в виде отдельных функций. |
| >>Скачать<< |
| Решение: |
//---------------------------------------------------------------------------
#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#define count 5
#define SIGN "VARIANT3.0"
struct STROKA
{
int len; //Длина строки
char str[256];
}DATA;
//---------------------------------------------------------------------------
int CreateFile(char FNAME[256])
{ //Функция копирования содержимого текстового файла в двоичный
FILE *input = fopen(FNAME,"rt");
FILE *output = fopen("DATA.bin","w");
if(!input || !output) return 0;
else
{
//Запись сигнатуры
int slen = strlen(SIGN) + 1;
if(fwrite(SIGN,sizeof(char),slen,output) != slen)
{
fclose(output);
output = NULL;
}
}
int i = 0;
while(fgets(DATA.str,256,input) != NULL) //Копирование содержимого файла
{
printf("%s",DATA.str); //Вывод строки на экран
DATA.len = strlen(DATA.str);
fwrite(&DATA,sizeof(DATA),1,output); //Запись структуры в файл
i++; //Счётчик записей (строк)
}
fwrite(&i,sizeof(int),1,output); //Запись счётчика строк в файл
fclose(input); //Закрытие файлов
fclose(output);
return 1;
}
//---------------------------------------------------------------------------
int OpenFile(char FNAME[256]) //Функция чтения из двоичного файла "DATA.bin"
{
FILE *fd = fopen(FNAME,"r"); //Открытие файла
if(fd) //Проверка сигнатуры
{
int slen = strlen(SIGN) + 1;
char buf[32]; //Проверка сигнатуры
if(fread(buf,sizeof(char),slen,fd) != slen)
{
printf("READING ERROR!!!\n");
fclose(fd);
fd = NULL;
}
else
if(strcmp(buf,SIGN) != 0)
{
printf("FORMAT ERROR!!!\n");
fclose(fd);
fd = NULL;
}
else
{
//Если все проверки пройдены...
int nmax = 0; //Количество записей в файле (находится в конце файла)
fseek(fd,-sizeof(int),SEEK_END); //Перемещение в конец файла
fread(&nmax,sizeof(int),1,fd);
fseek(fd,slen,SEEK_SET); //Перемещение в начало (позиция после сигнатуры)
int i = 0;
while(i != nmax) //Цикл чтения
{
fread(&DATA,sizeof(DATA),1,fd);
printf("%s",DATA.str);
i++;
}
fclose(fd); //Закрытие файла
return 1;
}
}
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
if(!CreateFile(argv[1])) puts("UNABLE TO CREATE NEW FILE!!!");
else puts("\n WRITING: OK!\n");
if(!OpenFile("DATA.bin")) puts("UNABLE TO OPEN FILE!!!");
else puts("\n READING: OK!\n");
system("PAUSE");
}
//---------------------------------------------------------------------------
|
|
| |