Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 13:

Файловый ввод/вывод в языке С

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >

Задание 4

  1. Для вывода информации из текстового файла поочередно используйте функции fgets() и fscanf().
  2. Инициализацию массива А выполните как инициализацию двухмерной матрицы с возможными сочетаниями числа строк и столбцов.
  3. В качестве строк разной длины используйте свою фамилию, имя, специальность и номер учебной группы.
  4. Массивы чисел определите как вещественные.
  5. Размерность массива задайте с клавиатуры и заполните его натуральными числами по строкам. Предусмотрите проверку возможности преобразования одномерного массива в двухмерный массив. Если возможно преобразование одномерного массив, то выполните вывод двухмерного массива в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.

Пример 5. Напишите программу добавления слов в текстовый файл с контролем на консоли [9].

В текстовый файл запишем название книги и авторов [3]. После будем добавлять слова, символы и т.д.

Для программного решения примера используем функции файлового ввода/вывода fprintf(), fgets() и rewind(). Кроме того, подключим библиотеку locale.h и объявим прототип функции, что позволит использовать шрифты русского алфавита:>

#include <locale.h>
    setlocale( LC_ALL, "Russian");

или

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

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

#define _CRT_SECURE_NO_WARNINGS
#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 ((fid = fopen(str_name, "a+")) == NULL)
{fprintf(stdout, "\n\t Файл не может быть открыт \"%s\".\n ", str_name); 
  printf("\n Нажмите любую клавишу: ");
_getch(); return -1; }
printf("\n\t Введите слова для включения их в файл \"%s\"\n\t\
и нажмите клавишу Enter в начале строки для завершения ввода\n\t: ", str_name);
	// Запись в файл data5.txt
while (gets_s(words, MAX) != NULL && words[0] != '\0')
{printf("\t: "); fprintf(fid," %s\n", words); }

puts("\t Содержимое файла:");
// Устанавливает указатель текущей позиции в начало файла
rewind(fid); 

// Сканирование файла
while (fgets(words, MAX, fid) != '\0')
	printf("\t%s", words);

if (fclose(fid) != 0)
fprintf(stderr, "\n\t Ошибка при закрытии файла \"%s\"\n", str_name);

printf("\n\n Нажмите любую клавишу (Press any key): ");
	_getch(); 
	return 0; 
}

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

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

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

Тогда проверку на открытие файла следует изменить, например:

if (fopen_s(&fid, "D:\\data5.txt","a+"))
{fprintf(stdout, "\n\t Ошибка! Не удается открыть файл \"data5.txt\".\n ");
printf("\n Нажмите любую клавишу: ");
_getch(); return -1; }

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

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

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

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

Задание 5

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

Примечание. Для данной программы формат записи функции fscanf():

fscanf(fid, "%s", words);

Пример 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 0; }

	printf("\n\t Enter a few lines and press Enter to complete before the new line\n\t: ");
	// Запись в файл data6.txt
while (gets_s(str, MAX) != NULL && str[0] != '\0')
{ printf("\t: "); fprintf(fid," %s\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 0; }

if ( fopen_s(&fid2, file2, "w") ) {
fprintf(stdout, "\n\t File could not be opened.\n");
printf("\n Press any key: ");
_getch(); return 0; }

//Переход в конец файла
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); } 
} // End for
putchar('\n');

fclose(fid);
fprintf(fid2, "%c", '\n');
fclose(fid2);

printf("\n Result see the files, \"%s\" and \"%s\"\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); } 
} // End for

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

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

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

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

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

Рис. 12.10. Результат записи информации в файл в обратном порядке
< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
помогите пожалуйста. не могу скачать ms. visual studio
Роман Островский
Роман Островский
Украина
Олег Корсак
Олег Корсак
Латвия, Рига