Файловый ввод/вывод в языке С
Задание 2
- Проверьте функцию fgetc() для чтения символов из файла.
- Посимвольную запись в текстовый файл строки "hello, world" осуществите с предварительной инициализацией соответствующего символьного массива.
- Программу выполните для записи в текстовые файлы с фамилией пользователя.
- Подготовьте текстовый файл со своей фамилией, именем, номера группы и специальности. Выполните чтение символов из этого файла с выводом на консоль и перезаписи в другой файл. Имя файла примите за compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Запишите в текстовый файл прописные буквы латинского алфавита и их коды.
Пример 3. Напишите программу чтения из текстового файла массива строк, вывода этих строк на консоль и записи их в другой файл.
Для решения примера используем функции fgets() – для чтения строк из текстового файла, fputs() – для записи строк в текстовый файл. Содержание текстового файла для считывания – это обложка книги [12.3]:
=============================================
THE
_____________________________________________
C
_____________________________________________
PROGRAMMING
LANGUAGE
=============================================
Second Edition
BRIAN W. KERIGHAN
DENNIS M. RITCHIE
AT & T Bell Laboratories
Murray Hill, New Jersey
Prentice Hall PTR, Upper Saddle River, New Jersey 07458
_________________________________________________________Файлу, из которого будет считываться информация, присвоим имя data3.txt. Файлу, куда будет записываться информация, присвоим имя data33.txt.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void){
char str[255+1];
char data3[] = "D:\\data3.txt";
char data33[] = "D:\\data33.txt";
FILE *fid, *fid2;
errno_t err;
if ((fopen_s(&fid, "D:\\data3.txt", "r")) ||
(err = fopen_s(&fid2, "D:\\data33.txt", "w")) != 0)
{ printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: ");
_getch();
return 0; }
while (fgets(str, 255, fid) != NULL) // Чтение из data3.txt
{fputs(str, stdout); // Вывод на консоль
fputs(str, fid2); // Запись в файл data33.txt
}
fclose(fid);
fclose(fid2);
printf(" Read the information was produced from a file %s\n", data3);
printf(" Recorded information has been made to the file %s\n", data33);
printf("\n Press any key: ");
_getch();
return 0;
}В программе с помощью логического условия ИЛИ ( || ) производится проверка корректности открытия файла data3.txt для чтения и проверка открытия файла data33.txt для записи. Вместо функции fopen() используется функция fopen_s(), которая применяется в MS Visual Studio.
Функция fgets() считывает строки из файла, на который имеется файловый указатель *fid, записывает их в символьный массив str[256]. Одно поле функции fgets() используется для определения количества считываемых символов с учетом символа завершения строки.
Первая функция fputs() используется для вывода информации на консоль с помощью определения стандартного выходного потока stdout, который указывает на "обычное" средство вывода – дисплей. Вторая функция fputs() выводит символьный массив str[] в файл data33.txt с помощью файлового указателя *fid2. Вывод на дисплей и запись в файл будет осуществляться до тех пор, пока при чтении из файла data3.txt не обнаружится признак конца файла, т.е. NULL. Проверку можно выполнять также по числу считанных символов, а именно n –1, т.е. в данном случае 255 символов из 256.
Результат выполнения программы с выводом текстовой информации на консоль показан на рис. 12.4.
Результат записи информации в текстовый файл показан на рис. 12.5.
Задание 3
- Подсчитайте число итераций, выполняемых функцией while().
- Вывод на консоль выполните с помощью функции printf(), а запись в файл – с помощью функции fprintf().
- Напишите программу ввода строк с клавиатуры и записи введенной информации в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа. В качестве вводимой информации используйте: свою фамилию, имя, число, месяц и год рождения, специальность, на которой вы учитесь, номер группы.
- Напишите программу записи в текстовый файл compX.txt матрицы вещественных случайных чисел из интервала [–X; X]. Произведите считывание матрицы из файла с выводом ее значений на консоль и записью еще в другой текстовый файл. Размер матрицы примите n
m, где n = 3*Х, m=2*X, где Х – номер компьютера, за которым выполняется лабораторная работа. - Напишите программу записи в текстовый файл символьного массива, состоящего из четырех строк и необходимого количества столбцов для записи строчных букв латинского алфавита (количество букв равно 26).
Примечание. Для п.5 задания 3 примените массив указателей для считывания строк разной длины.
Пример 4. Напишите программу форматированной записи в текстовый файл трех строк различной длины и одномерного целочисленного массива. Произведите чтение из текстового файла с выводом его содержания на консоль и преобразования одномерного массива в двухмерный.
Для решения примера используем функции fprintf(), fgets(), atoi(), fscanf().
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define n 4 // Число строк матрицы
#define m 3 // Число столбцов матрицы
#define N 123 // Число считываемых строк из текстового файла
int main(void) {
int i, j = 0;
int A[n*m] = {1,2,3,4,5,6,7,8,9,10,11,12};
int B[n*m];
FILE *fid;
char *str[] = {"aza","baza","qwerty"};
char str2[N][80]; // Буферный массив
// Обнуление массива B[n*m]
for (i = 0; i < n*m; ++i) B[i] = 0;
if ((fid = fopen("D:\\data4.txt", "w")) == NULL)
{printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: "); _getch(); return 0; }
// Запись в файл data4.txt
fprintf(fid, "\n\t The lines are:\n");
for (i = 0; i < m; ++i) fprintf(fid,"\t %s\n", str[i]);
for (i = 0; i < n*m; ++i)
fprintf(fid, " %3d", A[i]);
fclose(fid);
printf("\n\t From file \"data4.txt\":\n");
if ((fid = fopen("D:\\data4.txt", "r")) == NULL)
{printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: "); _getch(); return 0; }
// Чтение из файла data4.txt
for (i = 0; (fgets(str2[i], 80, fid) != NULL) && (i < N); ++i)
printf(" %s",str2[i]);
fclose(fid);
if ((fid = fopen("D:\\data4.txt", "r")) == NULL)
{printf("\n\t Error! You can not open the file \n ");
printf("\n Press any key: "); _getch(); return 0; }
// Повторное чтение из файла data4.txt
for (i = 0; fscanf (fid, "%s", str2[i]) != EOF; ++i)
if (atoi(str2[i]))
{ B[j] = atoi(str2[i]); ++j; }
fclose(fid);
printf("\n\n\t The reconfigured array:\n");
for (i = 0; i < n; ++i) {
printf("\n\t");
for (j = 0; j < m; ++j)
printf("%5d", B[i*m+j]); }
printf("\n\n Press any key: ");
_getch();
return 0;
}Для форматированной записи в текстовый файл и чтения из файла применены массивы указателей *str[], str2[123][80]. Чтение из файла одномерного массива целых чисел выполняется с помощью функции atoi(), значения целых чисел заносятся сначала в одномерный массив B[n*m]. После закрытия файла data4.txt одномерный массив B[n*m] выводится на консоль в виде двухмерной матрицы размера 4
3. Форматированная запись строк и одномерного массива в файл data4.txt производится с помощью функции fprintf(). Первое чтение информации из текстового файла производится с помощью функции fgets(), что позволяет практически точно копировать расположение строк текстового файла на консоль (дисплей). Функция fscanf() используется для форматированного чтения информации из текста с посл
едующим выделением целых чисел с помощью функции atoi().
Возможный результат выполнения программы показан на рис. 12.6.


