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

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

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

Практическая часть

Пример 1. Напишите программу заполнения матрицы размера n \times m нечетными целыми числами с выводом результата на консоль и в текстовый файл. Размеры матрицы и начальное нечетное число задаются пользователем с клавиатуры.

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void) {
int i, j, x, xi, n, m, *matr;
FILE *fid;
char str[] = "D:\\data.txt"; // месторасположение файла
if ((fid = fopen(str, "w")) == NULL){
	printf("\n\t The file could not be opened.\n ");
	printf("\n Press any key: ");
_getch(); return 0; }

printf("\n\t Enter the number of lines: "); scanf_s("%d", &n);
printf("\t Enter the number of columns: "); scanf_s("%d", &m);
printf("\t Enter the odd number: "); scanf_s("%d", &x);
xi = x;

matr = (int *)calloc(n*m, sizeof(int));
// Заполнение матрицы целыми числами
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
{matr[i*m + j] = x; x += 2; }

printf("\n\t Matrix (%d x %d), initial number: %d\n", n, m, xi);
fprintf(fid, "\r\n\t Matrix (%d x %d), initial number: %d\r\n", n, m, xi);
for (i = 0; i < n; ++i){
	printf("\n "); fprintf(fid, "\r\n ");
	for (j = 0; j < m; ++j){
printf("%5d", matr[i*m + j]); 
fprintf(fid, "%5d", matr[i*m + j]); }
}

fclose(fid);
printf("\n\n Result of record look in file %s\n", str);

printf("\n Press any key: ");
_getch();
return 0;
  }

В программу включена препроцессорная директива #define... для устранения предупреждения о ненадежной работе функции fopen() в Visual Studio 2008.

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

Заполнение матрицы нечетными числами

Рис. 12.1. Заполнение матрицы нечетными числами

Текстовый файл с заполненной матрицей показан на рис. 12.2.

Матрица нечетных чисел в текстовом файле

Рис. 12.2. Матрица нечетных чисел в текстовом файле

Примечание. В текстовом файле следует использовать моноширинный (равноширинный) шрифт, например, Courier New.

Задание 1

  1. Вместо функции calloc() примените функцию malloc().
  2. Найдите сумму элементов столбцов матрицы. Результат запишите под матрицей.
  3. Произведите заполнение матрицы нечетными числами по столбцам.
  4. Запишите сформированную матрицу в файл с расширениями .doc, .xls, .rtf, .csv. Просмотрите полученные файлы.
  5. Сформируйте матрицу из четных чисел размером (3*Х) \times (4*Х), результат выведите в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.

Пример 2. Напишите программу посимвольной записи в текстовый файл некоторой строки, набранной на консоли, и посимвольного чтения из текстового файла с перезаписью в другой текстовый файл.

В качестве строки возьмем "hello, world". Для посимвольной записи в файл используем функции putc() и fputc(), которые реализованы для сохранения совместимости со старыми версиями языка С. Для прекращения чтения символов с клавиатуры используем точку, т.е. '.'.

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>

int main(void){
char ch; FILE *f_in, *f_out;
char str[] = "D:\\data.txt"; // Файл записи
char str2[] = "D:\\data2.txt";// Файл перезаписи

if ((f_in = fopen(str, "w")) == NULL){
	printf("\n\t The file could not be opened.\n ");
	printf("\n Press any key: ");
_getch(); return 0;}

printf("\n Enter the characters by pressing Enter and exit point:\n\n> ");

while ((ch = getchar()) != '.')
{ printf(" "); fputc(ch, f_in);}
fclose(f_in);

if ((f_in = fopen(str, "r")) == NULL){
	printf("\n\t The file could not be opened.\n ");
	printf("\n Press any key: ");
_getch(); return 0; }

if ((f_out = fopen(str2, "w")) == NULL){
	printf("\n\t The file could not be opened.\n ");
	printf("\n Press any key: ");
_getch(); return 0;}

while((ch = getc(f_in)) != EOF) putc(ch, f_out);

fclose(f_in);
fclose(f_out);

printf("\n\n Result of record look in file %s\n", str);
printf(" Result of rewriting look in file %s\n", str2);

printf("\n Press any key: ");
_getch();
return 0; 
}

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

В среде Visual Studio стандартная функция fopen() языка С вызывает предупреждение при компиляции программы. Для устранения предупреждений при компиляции в программу включена препроцессорная директива #define_CRT_SECURE_NO_WARNINGS.

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

Консольный ввод символов для записи в файл

Рис. 12.3. Консольный ввод символов для записи в файл
< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
Александр Соболев
Александр Соболев
Россия
Артем Полутин
Артем Полутин
Россия, Саранск