Порядок выполнения работы. В каждой строке удалить лишние пробелы между словами и разместить их по левому краю




1. Разбор типового варианта

В каждой строке удалить лишние пробелы между словами и разместить их по левому краю, сохраняя первоначальную длину строки.

Программа должна получать имя файла как свой параметр. Поэтому выполнение программы должно начинаться с проверки того, задан ли этот параметр. Если параметр не задан, программа должна завершаться.

Программа будет состоять из двух фаз. В первой сформируем вспомогательный файл. Открытие файлов (файла-параметра программы, для чтения, и вспомогательного файла, для записи) должно сопровождаться проверкой успешности открытия. Если открытие неуспешно (причиной этого может быть, например, неправильно заданное имя файла), программа должна завершаться.

Считывая последовательно строки заданного файла, будем формировать соответствующие строки вспомогательного файла, записывая в них сначала все лишние пробелы, а потом остальные символы строки. Таким образом, мы получим новый файл (вспомогательный), содержащий преобразованные строки заданного файла. Закроем оба файла.

Во второй фазе вновь откроем основной файл (для записи) и вспомогательный (для чтения) и будем последовательно считывать строки вспомогательного файла и переписывать их в исходный файл.

В конце программы закроем оба файла и удалим вспомогательный файл.

Символьная строка, в которой сохраняется имя файла, который мы обрабатываем:

char filename[80];

Два буфера для сохранения входной и выходной строк, одни те же буферы используются на первой и на второй фазе. Размер обоих буферов - 81 символ (80 символов - ограничение, которое допускается условиями задания, + 1 символ - признак конца строки).

char buf1[81], buf2[81];

Символьные строки, как данные большого объема, должны размещаться в статической памяти. Остальные переменные - локальные в функции main().

Для реализации алгоритма нам, прежде всего, будут нужны файловые переменные - для входного и выходного файлов. Мы будем пользоваться функциями форматного ввода-вывода, которые требуют объявления файлов как переменных типа FILE*:

FILE *inf, *outf;

Эти две программные переменные используются и в первой, и во второй фазе программы, хотя в разных фазах они ассоциируются с разными физическими файлами.

Переменные для обработки строк как символьных массивов

int i,j;

Файлы, которые включаются в программу:

<stdio.h> - описания функций форматного ввода-вывода;

<string.h > - описания строковых функций (strlen(), string());

<stdlib.h> - описания функций общего назначения (exit()).

Функция main() имеет два параметра, это форматный состав параметров, которые передаются главной функции: второй параметр - массив указателей на символьные строки, первый - количество элементов в этом массиве. Элемент с индексом 0 - строка обращения к программе, а тот параметр, которого требуют спецификации (имя файла) - элемент с индексом 1. Проверка параметров состоит в проверке их количества.

if (an<2)

{

printf("Не задан параметр вызова\n");

exit(0);

}

затем переписываем значение параметра программы (название файла для обработки) в переменную filename

strcpy(filename,av[1]);

Для открытия файлов повсюду в программе используется функция fopen(), она возвращает указатель, который является файловой переменной в программе. Мы всегда проверяем этот указатель; если он пустой, мы выдаем на экран сообщение о невозможности открытия файла и завершаем программу с помощью функции exit().

if ((inf=fopen(filename,"r"))==NULL)

{

printf("Не возможно открыть файл %s\n",filename);

exit(0);

}

if ((outf=fopen("TMP","w"))==NULL)

{

printf("Не возможно создать файл TMP\n");

exit(0);

}

Заголовок цикла для считывания строк из файла

while(fgets(buf1,80,inf)!=NULL) {

Для чтения строки мы применяем функцию fgets(), которая считывает строку из файла. При попытке читать за концом файла эта функция возвращает NULL, что и есть признак конца файла. Следующий цикл записывает все лишний пробелы из строки buf1 в строку buf2:

for(i=0,j=0;i<strlen(buf1);i++)

if (buf1[i]==' ' && buf1[i+1]==' ')

buf2[j++]=' ';

Затем дописываем в buf2 все остальные символы

for(i=0;i<strlen(buf1);i++)

if ((buf1[i]!=' ') || (buf1[i]==' ' && buf1[i+1]!=' '))

buf2[j++]=buf1[i];

Полученную строку buf2 записываем в промежуточный файл.

fprintf(outf,buf2);

Закрываем цикл while и оба файла, а во второй фазе вновь открываем их (с другими параметрами), проверяя успешность открытия. При этом используем те же файловые переменные, но для других файлов.

Цикл чтения строк на второй фазе и записи их в исходный файл:

while (fgets(buf1,80,inf)!=NULL)

fprintf(outf,buf1);

Закрываем оба файла и уничтожаем временный файл (функцией unlink()).

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

 

char filename[80];

char buf1[81],buf2[81];

 

int main(int an,char *av[])

{

char *b1,*b2;

char os;

FILE *inf, *outf;

int i,j;

 

if (an<2)

{

printf("Не задан параметр вызова\n");

exit(0);

}

strcpy(filename,av[1]);

if ((inf=fopen(filename,"r"))==NULL)

{

printf("Не возможно открыть файл %s\n",filename);

exit(0);

}

if ((outf=fopen("TMP","w"))==NULL)

{

printf("Не возможно создать файл TMP\n");

exit(0);

}

 

while(fgets(buf1,80,inf)!=NULL)

{

for(i=0,j=0;i<strlen(buf1);i++)

if (buf1[i]==' ' && buf1[i+1]==' ')

buf2[j++]=' ';

for(i=0;i<strlen(buf1);i++)

if ((buf1[i]!=' ') || (buf1[i]==' ' && buf1[i+1]!=' '))

buf2[j++]=buf1[i];

buf2[j]=’\0’;

fprintf(outf,buf2);

}

fclose(inf);

fclose(outf);

 

if ((inf=fopen("TMP","r"))==NULL)

printf("Не возможно открыть файл TMP\n");

if ((outf=fopen(filename,"w"))==NULL)

printf("Не возможно открыть файл %s\n",filename);

 

while(fgets(buf1,80,inf)!=NULL)

fprintf(outf,buf1);

 

fclose(inf);

fclose(outf);

unlink("TMP");

return 0;

}

Результаты работы программы:

Входной файл:

a a a a

bb bb bb bb

ccc ccc ccc ccc

dddd dddd dddd dddd

eeeee eeeee eeeee eeeee

ffffff ffffff ffffff ffffff

 

Выходной файл:

 

a a a a

bb bb bb bb

ccc ccc ccc ccc

dddd dddd dddd dddd

eeeee eeeee eeeee eeeee

ffffff ffffff ffffff ffffff

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-12-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: