Студопедия — Setlocale( LC_ALL, ".1251" );//кодовая страница Windows – 1251
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Setlocale( LC_ALL, ".1251" );//кодовая страница Windows – 1251






Программный код решения примера

#include <stdio.h> #include <conio.h> #include <locale.h> #define MAX 40 int main(void) { FILE *fid; char words[MAX+1]; char str_name[] = "D:\\data5.txt"; setlocale(LC_ALL, "Russian"); // setlocale(LC_ALL, ".1251"); if ((fopen_s(&fid, str_name, "a+"))!= 0) {fprintf(stdout, "\n\t Файл не может быть открыт \"%c\".\n ", str_name); printf("\n Нажмите любую клавишу: "); getch(); return -1; } printf("\n\t Введите слова для включения их в файл \"%c\"\n\t\ и нажмите клавишу Enter в начале строки для завершения ввода\n\t: ", str_name); // Запись в файл data5.txt if (gets_s(words, MAX)!= NULL && words[0]!= '\0') {printf("\t: "); fprintf(fid," %c\n", words); } puts("\t Содержимое файла:"); // Устанавливает указатель текущей позиции в начало файла rewind(fid); // Сканирование файла if (fgets(words, MAX, fid)!= '\0') printf("\t%c", words); if (fclose(fid)!= 0) fprintf(stderr, "\n\t Ошибка при закрытии файла \"%c\"\n", str_name); printf("\n\n Нажмите любую клавишу: "); getch(); return 0; }

В программе введены две проверки: на открытие файла if (¼!= 0) и на его закрытие if (¼!= 0), позволяющие исключить аварийный выход из программы. Использование в функции форматного вывода fprintf() ключевого слова stdout позволяет выводить сообщения на консоль – дисплей пользователя.


Вместо стандартной функции gets(), приработе с которой появляются предупреждения, использована функция gets_s(), которую поддерживает MS Visual Studio. Предупреждения возникают и при обращении к функции fopen(). Вместо нее применена fopen_s() в следующем формате записи:

fopen_s(&fid, "D:\\data5.txt","a+");

Если файл data5.txt сохранить, то при последующих выполнениях программы в него можно будет дописывать данные. Это обеспечивает режим "a+"; функции fopen_s().


Возможный результат выполнения программы показан на рис. 12.7.

Рис. 12.7. Пример записи в файл и чтения из файла

Задание 5

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

2. В программу вместо функции fgets() включите функцию fscanf(). Отметьте результат записи и чтения некоторого количества строк, состоящих из нескольких слов.

3. Отметье результат выполнения программы, если изменить имя текстового файла на диске D.

Пример 6. Написать программу записи в файл нескольких строк и отображения содержимого файла в обратном порядке как на консоли, так и в другом текстовом файле.

Для решения примера используем функции fseek() и ftell().


 

Программный код решения примера

#include <stdio.h> #include <conio.h> #define MAX 79 #define file "D:\\data6.txt" // запись в прямом порядке #define file2 "D:\\data66.txt" // запись в обратном порядке int main(void) { char ch, str[MAX+1]; long n, m; FILE *fid, *fid2; if (fopen_s(&fid, file, "w")) { fprintf(stdout, "\n\t The file could not be opened.\n "); printf("\nPress any key: "); getch(); return -1; } printf("\n\t Enter a few lines and press Enter to complete before the new line\n\t: "); // Запись в файл data6.txt if (gets_s(str, MAX)!= NULL && str[0]!= '\0') { printf("\t: "); fprintf(fid," %c\n", str); } fclose(fid); if (fopen_s(&fid, file, "r")) { fprintf(stdout, "\n\t File could not be opened.\n"); printf("\n Press any key: "); getch(); return -1; } if (fopen_s(&fid2, file2, "w")) { fprintf(stdout, "\n\t File could not be opened.\n"); printf("\n Press any key: "); getch(); return -1; } //Переход в конец файла fseek(fid, 0L, SEEK_END); m = ftell(fid); for (n = 1L; n <= m; n++) { fseek(fid, -n, SEEK_END); ch = getc(fid); if (ch!= '\n') { printf(" "); putchar(ch); fprintf(fid2, " "); putc(ch, fid2); } } putchar('\n'); fclose(fid); fprintf(fid2, "%c", '\n'); fclose(fid2); printf("\n Result see the files, \"%c\" and \"%c\"\n", file, file2); printf("\n Press any key: "); getch(); return 0; }

Опишем работу функций fseek() и ftell() [9].

Функция fseek() имеет следующую форматную запись:

fseek(fid, 0L, SEEK_END);

Она определяет позицию со смещением в 0 байт от конца файла (именованная константа SEEK_END). Суффикс L означает тип long int.

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

m = ftell(fid);

Рассмотрим следующий программный цикл.

for (n = 1L; n <= m; n++) { fseek(fid, -n; SEEK_END); ch = getc(fid); if (ch!= '\n') { printf(" "); putchar(ch); fprintf(fid2, " "); putc(ch, fid2); } }

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

Возможные результаты выполнения программы приведены на рис. 12.8–12.10.


 


Рис. 12.8. Результат обратного считывания информации из файла


Рис. 12.9. Результат записи информации в файл

Рис. 12.10. Результат записи информации в файл в обратном порядке

Задание 6

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

2. Вместо функции putchar() примените printf().

3. Вместо функции putc() примените функцию с тем же действием.

4. Подготовьте текстовый файл со своими фамилией, инициалами, номером группы, специальности. Выполните чтение из этого файла в обратном порядке, выведите на консоль и запишите в дополнительный текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

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

Предположим, что имеются номера ячеек, их имена (например, по фамилии владельца) и определенное количество денег в условных единицах (у. е.).

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

Программный код решения примера

#include <stdio.h> #include <conio.h> #define MAX 39 // предполагаемое число символов в имени #define file "D:\\data7.dat" #define file2 "D:\\data77.dat" int main(void) { int number, i = 1, j = 1; // номер ячейки char name[MAX+1]; // имя ячейки (владельца) long double sum; // сумма денег в у.е. FILE *fid, *fid2; if (fopen_s(&fid, file, "w")) {fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: "); getch(); return -1; } printf("\n Enter through blanks number of a cell,\n a name of the owner and the sum of money.\nType Ctrl+Z to exit at the beginning of a new line: \n\n"); printf(" %3d) ", i); scanf_s("%d%c%lf", &number, name, MAX, &sum); // Запись в файл data7.dat if (!feof(stdin)) { // stdin - поток с клавиатуры fprintf(fid, " %3d\t %-15s %7.2f\r\n", number, name, sum); printf(" %3d) ", ++i); scanf_s("%d%c%lf", &number, name, MAX, &sum); } fclose(fid); if (fopen_s(&fid, file, "r")) { fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: "); getch(); return -1; } if (fopen_s(&fid2, file2, "w")) { fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: "); getch(); return -1; } // Вывод на консоль printf("\n %c\t %c\t\t %5s", "The number of cell","Name","Sum"); // Чтение из файла data7.dat fscanf_s(fid, "%d%c%Lf", &number, name, MAX, &sum); fprintf(fid2, "\r\n %c\t\t %c\t\t %5s\r\n", "The number of cell", "Name", "Sum"); i = 1; if (!feof(fid)) { // пока не конец файла // Вывод на консоль printf("\n %3d\t\t\t %-17s %0.2f", number, name, sum); // Запись в файл data77.dat fprintf(fid2," %3d) %3d\t\t\t %-17s %0.2f\r\n",i++,number,name, sum); // Чтение из файла data7.dat fscanf_s(fid, "%d%c%Lf", &number, name, MAX, &sum); } fclose(fid); fclose(fid2); printf("\n\n\n Result see the files, \"%c\" and \"%c\"\n", file, file2); printf("\n Press any key: "); getch(); return 0; }

В программе использована функция feof(), которая проверяет, достигнут ли конец файла, связанного с потоком (указателем на файл) fid.


На рис. 12.11 показан возможный результат выполнения программы.

Рис. 12.11. Консольный вывод содержимого файла

Следует обратить внимание на прекращение ввода данных с клавиатуры с помощью комбинации клавиш Ctrl+Z.

Задание 7

1. Вместо оператора цикла if примените оператор цикла for.

2. Отсортируйте записи владельцев ячеек по убыванию величины суммарной денежной суммы.

3. Подготовьте форматированный текстовый файл с именем compX, где Х – номер компьютера, на котором выполняется лабораторная работа. Затем информацию из файла выведите на консоль.

Пример 8. Написать программу пакетной записи в файл произвольного доступа массива данных и вывода этого пакета на консоль.

При решении примера применим функции fwrite() и fread() для бинарной записи и считывания информации.

Программный код решения примера

#include <stdio.h> #include <conio.h> #define MAX 20 #define n 5 #define m 4 #define file "D:\\data8.txt" int main(void) { //Матрица 5х4 int mass[MAX][MAX] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}, {17,18,19,20} }; int mass2[MAX][MAX]; // вспомогательная матрица int i, j; // Массив из 5 указателей char *str[] = { "Brian W. Kernighan", "Dennis M. Ritchie", "Stephen Prata", "Herbert Shildt", "The C Programming Language" }; char**str2[n]; // вспомогательный массив указателей FILE *fid; if (fopen_s(&fid, file, "wb")) { fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Error! Press any key: "); getch(); return -1; } fwrite(str, sizeof(char), sizeof(str)/sizeof(char), fid); fwrite(mass, sizeof(int), sizeof(mass)/sizeof(int), fid); fclose (fid); if (fopen_s(&fid, file, "rb")) { fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: "); getch(); return -1; } fread(str2, sizeof(char), sizeof(str)/sizeof(char), fid); fread(mass2, sizeof(int), sizeof(mass2)/sizeof(int), fid); // Чтение элементов из файла printf("\n\t From a file \"%c\": \n\n", file); for (i = 0; i < n; ++i) printf("\t %-15s\n", str2[i]); printf("\n\t Matrix from a file \"%c\":\n", file); for (i = 0; i < n; ++i) { printf("\n\t"); for (j = 0; j < m; ++j) printf(" %3d", mass2[i][j]); } fclose(fid); printf("\n\n\n Press any key: "); getch(); return 0; }

Функция fwrite() записывает в файл заданное количество байт из буфера памяти, адрес которого передан ей в качестве параметра. Данные записываются с того места в файле, которое обозначено указателем позиции файла. Функция fread() считывает заданное количество байт, начиная с текущей позиции файла в буфер памяти, адрес которого передан ей в качестве параметра.

В программе пакетная запись информации – набора строк и матрицы целых чисел производится через двоичный поток с помощью функций fwrite(). Чтение информации из двоичного файла осуществляется функцией fread(). Форматы записи обеих функций одинаковы, так как в них требуется установить количество объектов с заданным размером байт, которые определяются функцией sizeof().

Результат выполнения программы представлен на рис. 12.12 и 12.13.


 


Рис. 12.12. Результат чтения из файла бинарной информации

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

Как видно из рис. 12.12 и 112.13, информация на консоли соответствует исходной информации, а в двоичном файле она не подлежит непосредственному восприятию.

Примечание. Вид бинарной информации в текстовом файле зависит от установленных шрифтов.

Задание 8

1. Запишите двоичную информацию в файлы с расширением .dat, .doc, .bin. Проанализируйте файлы после их открытия.

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

3. Вместо массива указателей примените схему с двухуровневой адресацией.

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

5. Перезапишите информацию из двоичного файла в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.


 

Контрольные вопросы

1. Что может быть файлом в языке С?

2. Какие обязательные операции выполняются при нормальной работе с файлами? Какие библиотечные функции при этом используются?

3. Как определяется текстовой поток в стандарте языка С?

4. Как определяется двоичный поток в стандарте языка С?

5. Что представляет собой указатель файла?

6. С помощью каких функций языка С осуществляются форматная запись в файл и форматное чтение данных из файла?

7. Какая переменная стандартной библиотеки используется для определения стандартного потока вывода на дисплей?

8. Какая переменная стандартной библиотеки используется для определения стандартного потока чтения с дисплея?

9. Как в языке С кодируется признак конца файла?

10. Как в языке С кодируется признак конца строки?

11. Что такое файл произвольного доступа?

12. Как в языке С осуществляется пакетная запись данных в файл?

13. Как осуществляется запись бинарной информации в текстовый файл?

14. Как осуществляется чтение бинарной информации из текстового файла?







Дата добавления: 2015-09-06; просмотров: 1185. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Толкование Конституции Российской Федерации: виды, способы, юридическое значение Толкование права – это специальный вид юридической деятельности по раскрытию смыслового содержания правовых норм, необходимый в процессе как законотворчества, так и реализации права...

Значення творчості Г.Сковороди для розвитку української культури Важливий внесок в історію всієї духовної культури українського народу та її барокової літературно-філософської традиції зробив, зокрема, Григорій Савич Сковорода (1722—1794 pp...

Постинъекционные осложнения, оказать необходимую помощь пациенту I.ОСЛОЖНЕНИЕ: Инфильтрат (уплотнение). II.ПРИЗНАКИ ОСЛОЖНЕНИЯ: Уплотнение...

Тема: Составление цепи питания Цель: расширить знания о биотических факторах среды. Оборудование:гербарные растения...

В эволюции растений и животных. Цель: выявить ароморфозы и идиоадаптации у растений Цель: выявить ароморфозы и идиоадаптации у растений. Оборудование: гербарные растения, чучела хордовых (рыб, земноводных, птиц, пресмыкающихся, млекопитающих), коллекции насекомых, влажные препараты паразитических червей, мох, хвощ, папоротник...

Типовые примеры и методы их решения. Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно. Какова должна быть годовая номинальная процентная ставка...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия