Файловый ввод/вывод в языке С
Практическая часть
Пример 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.