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

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

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

Задание 2

  1. Проверьте функцию fgetc() для чтения символов из файла.
  2. Посимвольную запись в текстовый файл строки "hello, world" осуществите с предварительной инициализацией соответствующего символьного массива.
  3. Программу выполните для записи в текстовые файлы с фамилией пользователя.
  4. Подготовьте текстовый файл со своей фамилией, именем, номера группы и специальности. Выполните чтение символов из этого файла с выводом на консоль и перезаписи в другой файл. Имя файла примите за compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
  5. Запишите в текстовый файл прописные буквы латинского алфавита и их коды.

Пример 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.4. Консольный вывод содержимого текстового файла

Результат записи информации в текстовый файл показан на рис. 12.5.

Результат записи текстовой информации в текстовый файл

Рис. 12.5. Результат записи текстовой информации в текстовый файл

Задание 3

  1. Подсчитайте число итераций, выполняемых функцией while().
  2. Вывод на консоль выполните с помощью функции printf(), а запись в файл – с помощью функции fprintf().
  3. Напишите программу ввода строк с клавиатуры и записи введенной информации в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа. В качестве вводимой информации используйте: свою фамилию, имя, число, месяц и год рождения, специальность, на которой вы учитесь, номер группы.
  4. Напишите программу записи в текстовый файл compX.txt матрицы вещественных случайных чисел из интервала [–X; X]. Произведите считывание матрицы из файла с выводом ее значений на консоль и записью еще в другой текстовый файл. Размер матрицы примите n \times m, где n = 3*Х, m=2*X, где Х – номер компьютера, за которым выполняется лабораторная работа.
  5. Напишите программу записи в текстовый файл символьного массива, состоящего из четырех строк и необходимого количества столбцов для записи строчных букв латинского алфавита (количество букв равно 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 \times 3. Форматированная запись строк и одномерного массива в файл data4.txt производится с помощью функции fprintf(). Первое чтение информации из текстового файла производится с помощью функции fgets(), что позволяет практически точно копировать расположение строк текстового файла на консоль (дисплей). Функция fscanf() используется для форматированного чтения информации из текста с посл едующим выделением целых чисел с помощью функции atoi().

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

Содержимое текстового файла и преобразованного массива

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