Файловый ввод/вывод в языке С
Практическая часть
Пример 1. Напишите программу заполнения матрицы размера n
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.2.
Примечание. В текстовом файле следует использовать моноширинный (равноширинный) шрифт, например, Courier New.
Задание 1
- Вместо функции calloc() примените функцию malloc().
- Найдите сумму элементов столбцов матрицы. Результат запишите под матрицей.
- Произведите заполнение матрицы нечетными числами по столбцам.
- Запишите сформированную матрицу в файл с расширениями .doc, .xls, .rtf, .csv. Просмотрите полученные файлы.
- Сформируйте матрицу из четных чисел размером (3*Х)
(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.

