- •Списки §1. Общие сведения о списках
- •§2. Создание списка
- •§3. Просмотр и анализ списка
- •3.1. Просмотр и анализ списка целых чисел.
- •3.2. Просмотр и анализ списка одномерных массивов.
- •§6. Сравнительный анализ списков.
- •§1. Порядок работы с файлом
- •1.1. Потоки и файлы
- •1.2. Объявление файла
- •1.3. Открытие файла.
- •1.4. Закрытие файла.
- •§2. Работа с текстовым файлом
- •2.1. Посимвольная работа с текстовым файлом
- •Int fputc(int ch, file *stream)
- •2.2. Построчная работа с текстовым файлом
- •§3. Функции блокового ввода/вывода
- •3.1. Экономические задачи с использованием файлов
- •3.2. Математические задачи с использованием файлов
- •§4. Прямой (произвольный) доступ к файлу
- •4.1. Функция fseek()
- •4.2. Замена записи. Функции ftell, fgetpos, fsetpos, rewind.
- •Пример. В файл записать координаты точек плоскости. Найти две (любые) точки с наибольшим расстоянием между ними. Массив для хранения координат всех точек не использовать.
- •Упражнения, тесты.
- •Функции (дополнительные возможности)
- •§1. Функции с переменным количеством параметров.
- •§2. Указатели на функции.
- •§3. Массив указателей на функции.
- •§4. Введение в рекурсивные функции.
- •Упражнения, тесты.
- •Void Fun1 (float); void Fun2(float); void Fun3(float);
- •Лабораторная работа № 12.
- •Команды препроцессора (директивы компиляции)
- •§1. Директива define (замены в тексте)
- •Простое макроопределение (макрос)
- •Макрос с аргументами.
- •Директива #undef.
- •§2. Директива #include (включение файлов).
- •§3. Директивы условной компиляции.
- •Директива #if.
- •Директивы #ifdef и #ifndef.
- •Упражнения, тесты
- •История развития технологий программирования
- •§1. Программирование в машинных кодах и на языках символического кодирования
- •§2. Языки высокого уровня. Структурное и модульное программирование
- •§3. Интегрированные системы программирования.
- •§4. История и идеи объектно-ориентированного программирования.
- •§5. Программирование для Windows. Визуальное программирование.
- •Литература
- •Оглавление Предисловие………………………………………………………….…………………3
- •Г л а в а 4. Структуры и другие типы, определяемые пользователем.84
- •Г л а в а 6. Файлы ………………………………………………………..154
- •Г л а в а 7. Функции (дополнительные возможности) ………………190
- •Г л а в а 9. История развития технологий программирования ……220
2.2. Построчная работа с текстовым файлом
Пример 2. Работа с текстовым файлом построчно с помощью стандартных функций fputs и fgets.
const size =80; char str[size]; FILE *tf;
//Функция для построчного создания текстового файла с помощью fputs.
void MyCreate()
{ clrscr();
if ((tf=fopen("d:\\ANA\\cpp\\2005_06\\ FileStr\\textf2.dat ","w"))==NULL)
{ printf("Error\n"); return ; }
else printf("File is opened for creating\n");
puts("@@@ -- exit\n");
gets(str); // Вводим первую строку с экрана вне цикла.
do {
/* Записываем строку из оперативной памяти (str) на внешнее устройство в файл (tf). */
fputs(str,tf);
/* После каждой строки в файл записываем символ новой строки */
fputc('\n',tf);
/* В цикле вводим следующие строки с экрана */
gets(str);
}
while(!strstr(str,"@@@"));
fclose(tf);
}
/* Функция int fputs (const char *str, FILE *stream) записывает содержимое строки, на которую указывает str, в заданный поток. Нуль в конце строки не записывается. Символ новой строки записывается, чтобы “помочь” функции чтения строки определить её конец(см. описание fgets). В случае успешной записи возвращается последний записанный символ, а в случае неудачи — EOF. При работе с потоком в текстовом режиме могут иметь место преобразования символов (см. 1.1). Для двоичного режима такого преобразования символов нет и строка переписывается в файл “один к одному”.
Для выхода из цикла, то есть, чтобы прекратить создание файла, необходимо ввести не менее трёх подряд идущих символа “@” (см. описание строковой функции strstr). */
// Функция для добавления в конец текстового файла
void MyAppend()
{ clrscr();
if ((tf=fopen("d:\\ANA\\cpp\\2005_06\\ FileStr\\textf2.dat ","a"))==NULL)
{ printf("Error\n"); return ;
}
else printf("File is opened for appending\n");
puts("@@@ -- exit\n");
gets(str);
do { fputs(str,tf);
fputc('\n',tf);
gets(str);
}
while(!strstr(str,"@@@"));
fclose(tf);
}
/* Как видим, эта функция почти ничем не отличается от предыдущей функции создания файла. Только при открытии файла вместо режима “w” указан “a”, так как мы открываем файл для добавления в его конец.
Функция для построчного просмотра и анализа созданного файла. В прочитанном из файла тексте найти количество гласных букв.*/
void MyRead()
{ clrscr();
if ((tf=fopen("d:\\ANA\\cpp\\2004_05\\ FileStr\\textf2.dat ","r"))==NULL)
{ printf("Error\n"); return ;
}
else printf("File is opened for reading\n");
int i,k=0;
while ( fgets ( str, size, tf)!=NULL)
{
/* Прочитали одну строку из файла и проверили результат операции чтения. */
printf("%s",str); // Вывод одной строки на экран.
// Посимвольный анализ одной прочитанной строки
for(int i=0; str[i]; i++)
if (strchr("aeyuio" , str[i]))k++;
}
cout<<"\n "<<k<<'\n';
fclose (tf);
}
int main()
{ int flag;
do { cout<<"1 -- Create file\n"<<
"2 -- Look file\n"<<
"3 -- Append file\n"<<
"0 -- Exit\n";
cin>>flag;
switch (flag)
{ case 1: MyCreate(); break;
case 2: MyRead() ; break;
case 3: MyAppend(); break;
case 0: return 0;
}
} while (1);
return 0;
}
Функция char * fgets (char *str, int num, FILE *stream) считывает до (num-1) символов из указанного потока и помещает их в массив символов, на который указывает str. Символы считываются до тех пор, пока не встретится символ “новая строка”, EOF или пока не будет прочитано (num-1) символов. В нашем случае чаще всего строка будет читаться, пока не встретится символ “новая строка”, который после каждой строки мы записывали в функции создания. Поэтому не обязательно, чтобы каждая строка содержала ровно 80 символов. По окончании считывания сразу после последнего считанного символа помещается нулевой символ. Символ “новая строка” также помещается в массив str.
В случае успешного чтения fgets возвращает прочитанную строку (в примере str), а при неудаче — NULL. В случае ошибки чтения содержимое массива, на который указывает str, не определено. При достижении конца файла также возвращается NULL, и это в нашем варианте использовалось в операторе цикла while. Каждый раз в цикле читается одна строка и результат этой операции, то есть указатель на строку, сравнивается на NULL. Если при очередной попытке чтения строки из файла будет достигнут его конец, то выражение в заголовке while станет ложным и мы выйдем из цикла.
Для проверки на конец файла можно также использовать функцию feof().
Головная функция аналогична примеру 1, поэтому её описание смотри в 2.1.