Файловый ввод/вывод в языке С
Задание 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.