Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

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

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

Задание3

1.Подсчитайте число итераций, выполняемых функцией while().

2.Вывод на консоль выполните с помощью функции printf(), а запись в файл – посредством функции fprintf().

201

3.Напишите программу ввода строк с клавиатуры и записи введенной информации в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В качестве вводимой информации используйте название дисциплин, которые Вы изучаете на данный момент, а также специальность, на которой Вы учитесь.

4.Напишите программу записи в текстовый файл compX.txt матрицы вещественных случайных чисел из интервала [–X; X], где Х – номер компьютера, на котором выполняется лабораторная работа. Произведите считывание матрицы из файла с выводом ее значений на консоль и записью в другой текстовый файл. Размер матрицы примите n × m, где n = 3Х, m= 2X,.

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 -1; }

202

//Запись в файл 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 -1; }

//Чтение из файла 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 -1; }

// Повторное чтение из файла 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 этот же массив выводится на консоль в виде двухмерной матрицы размера 4 × 3. Форматированная запись строк и одномерного массива в файл data4.txt производится с помощью функции fprintf(). Первое чтение информации из текстового файла осуществляется

203

посредством функции fgets(), что позволяет практически точно копировать расположение строк текстового файла на консоль (дисплей). Функция fscanf() используется для форматированного чтения информации из текста с последующим выделением целых чисел с помощью функции atoi().

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

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

Задание4

1.Для вывода информации из текстового файла поочередно используйте функции fgets() и fscanf().

2.Инициализацию массива А выполните как инициализацию двухмерной матрицы с возможными сочетаниями числа строк и столбцов.

3.В качестве строк разной длины используйте название факультета, свою фамилию, специальность и номер учебной группы, в которой Вы учитесь.

4.Массивы чисел определите как вещественные.

5.Размерность массива задайте с клавиатуры и заполните его натуральными числами по строкам. Предусмотрите проверку возможности преобразования одномерного массива в двухмерный. Если преобразование возможно, то выведете двухмерный массив в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

Пример 5. Написать программу добавления слов в текстовый файл с контролем на консоли [9].

В текстовый файл запишем название книги и ее авторов [3]. Затем будем добавлять слова, символы и т. д.

Для программного решения примера используем функции файлового ввода / вывода fprintf(), fgets() и rewind(). Кроме того, подключим библиотеку locale.h и объявим прототип функции, что позволит использовать шрифты русского алфавита:

#include <locale.h>

setlocale( LC_ALL, "Russian" );// setlocale( LC_ALL, "rus" );

или

setlocale( LC_ALL, ".1251" );// кодовая страница Windows-1251

204

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <locale.h> #define MAX 40

int main(void) {

FILE *fid;

char words[MAX+1];

char str_name[] = "D:\\data5.txt";

setlocale( LC_ALL, "Russian");

// setlocale( LC_ALL, ".1251");

if ( (fopen_s(&fid, str_name, "a+") ) != 0) {fprintf(stdout, "\n\t Файл не может быть открыт \"%s\".\n

", str_name); printf("\n Нажмите любую клавишу: "); _getch(); return -1; }

printf("\n\t Введите слова для включения их в файл

\"%s\"\n\t\

и нажмите клавишу Enter в начале строки для завершения ввода\n\t: ", str_name);

// Запись в файл data5.txt

while (gets_s(words, MAX) != NULL && words[0] != '\0') {printf("\t: "); fprintf(fid," %s\n", words); }

puts("\t Содержимое файла:");

//Устанавливает указатель текущей позиции в начало файла rewind(fid);

//Сканирование файла

while (fgets(words, MAX, fid) != '\0') printf("\t%s", words);

if (fclose(fid) != 0)

fprintf(stderr, "\n\t Ошибка при закрытии файла

\"%s\"\n", str_name);

printf("\n\n Нажмите любую клавишу: "); _getch();

return 0;

}

В программе введены две проверки: на открытие файла if ( != 0) и на его закрытие if ( != 0), позволяющие исключить аварийный выход из программы. Использование в функции fprintf() ключевого слова stdout позволяет выводить сообщения на консоль – дисплей пользователя.

205

Вместо стандартной функции gets(), при работе с которой появляются предупреждения, использована функция gets_s(), которую поддерживает MS Visual Studio. Предупреждения возникают и при обращении к функции fopen(), вместо нее применена fopen_s() в следующем формате записи:

fopen_s(&fid, "D:\\data5.txt","a+");

Если файл data5.txt сохранить, то при последующих выполнениях программы в него можно будет дописывать данные. Это обеспечивает режим

"a+" функции fopen_s().

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

Рис. 12.7. Пример записи в файл и чтения из файла

Задание5

1.В программу при записи в файл и чтения из файла введите свою фамилию, специальность, на которой Вы учитесь, и номер группы.

2.В программу вместо функции fgets() включите функцию fscanf(). Отметьте результат записи и чтения некоторого количества строк, состоящих из нескольких слов.

3.Отметьте результат выполнения программы при изменении имени текстового файла на диске D.

Пример 6. Написать программу записи в файл нескольких строк и отображения содержимого файла в обратном порядке как на консоли, так и в другом текстовом файле.

Для решения примера используем функции fseek() и ftell().

206

Программный код решения примера

#include <stdio.h> #include <conio.h>

#define MAX 79

#define file "D:\\data6.txt" // запись в прямом порядке #define file2 "D:\\data66.txt" // запись в обратном порядке

int main(void) {

char ch, str[MAX+1]; long n, m;

FILE *fid, *fid2;

if ( fopen_s(&fid, file, "w") ) {

fprintf(stdout, "\n\t The file could not be opened.\n "); printf("\nPress any key: ");

_getch(); return -1; }

printf("\n\t Enter a few lines and press Enter to complete before the new line\n\t: ");

// Запись в файл data6.txt

while (gets_s(str, MAX) != NULL && str[0] != '\0') { printf("\t: "); fprintf(fid," %s\n", str); }

fclose(fid);

if ( fopen_s(&fid, file, "r") ) {

fprintf(stdout, "\n\t File could not be opened.\n"); printf("\n Press any key: ");

_getch(); return -1; }

if ( fopen_s(&fid2, file2, "w") ) {

fprintf(stdout, "\n\t File could not be opened.\n"); printf("\n Press any key: ");

_getch(); return -1; }

// Переход в конец файла fseek(fid, 0L, SEEK_END); m = ftell(fid);

for (n = 1L; n <= m; n++) { fseek(fid, -n, SEEK_END); ch = getc(fid);

if (ch != '\n') {

printf(" "); putchar(ch); fprintf(fid2, " "); putc(ch, fid2); }

}

putchar('\n');

fclose(fid);

207

fprintf(fid2, "%c", '\n'); fclose(fid2);

printf("\n Result see the files, \"%s\" and \"%s\"\n", file, file2);

printf("\n Press any key: "); _getch();

return 0;

}

Опишем работу функций fseek() и ftell()[9]. Функция fseek()имеет следующую форматную запись: fseek(fid, 0L, SEEK_END);

Она определяет позицию со смещением в 0 байт от конца файла (именованная константа SEEK_END). Суффикс L означает тип long int.

Строка с функцией ftell() определяет количество байтов от начала до конца указанного файла которое записывается в переменную m:

m = ftell(fid);

Рассмотрим следующий программный цикл.

for ( n = 1L; n <= m; n++ )

{

fseek( fid, -n; SEEK_END ); ch = getc( fid );

if ( ch!= '\n' )

{

printf(" "); putchar( ch );

fprintf( fid2, " " ); putc( ch, fid2 );

}

}

Первая итерация цикла выводит программу на первый символ перед концом файла. Затем программа печатает этот символ на консоль и записывает в новый файл с именем data66.txt. Следующая итерация выводит программу на предпоследний символ файла, который она печатает и записывает в новый файл. Этот процесс продолжается до тех пор, пока программа не выйдет на первый символ файла и не распечатает его (и запишет в файл).

Возможные результаты выполнения программы приведены на рис.12.8–

12.10.

208

Рис. 12.8. Результат обратного считывания информации из файла

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

Рис. 12.10. Результат записи информации в файл в обратном порядке

Задание6

1.Вывод информации в дополнительный текстовый файл сделайте построчно, каждую строку запишите в обратном порядке (для рассмотренного примера в три строки).

2.Вместо функции putchar() примените printf().

3.Вместо функции putc() примените функцию с тем же действием.

4.Подготовьте текстовый файл со своими фамилией, инициалами, номером группы, специальности. Выполните чтение из этого файла в обратном порядке, выведите на консоль и запишите в дополнительный текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

Пример 7. Создать файл последовательного доступа и записать в него информацию, состоящую из целых чисел, строки символов и вещественных чисел. После произведенной записи вывести содержимое файла на консоль и перезаписать в другой файл.

Предположим, что имеются номера ячеек, их имена (например, по фамилии владельца) и определенное количество денег в условных единицах (у. е.).

209

Для форматированного считывания данных из файла применим библиотечную функцию fscanf_s().

Программный код решения примера

#include <stdio.h> #include <conio.h>

#define MAX 39 // предполагаемое число символов в имени

#define file "D:\\data7.dat" #define file2 "D:\\data77.dat"

int main(void) {

int number, i = 1, j = 1; // номер ячейки

char

name[MAX+1];

//

имя ячейки (владельца)

long double sum;

//

сумма денег в у.е.

FILE

*fid, *fid2;

 

 

 

 

 

 

if ( fopen_s(&fid, file, "w") )

{fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: ");

_getch(); return -1; }

printf("\n Enter through blanks number of a cell,\n a name of the owner and the sum of money.\nType Ctrl+Z to exit at the beginning of a new line: \n\n");

printf(" %3d) ", i);

scanf_s("%d%s%lf", &number, name, MAX, &sum);

// Запись в файл data7.dat

while ( !feof(stdin)) { // stdin - поток с клавиатуры fprintf(fid, " %3d\t %-15s %7.2f\r\n", number, name, sum);

printf(" %3d) ", ++i);

scanf_s("%d%s%lf", &number, name, MAX, &sum);

}

fclose(fid);

if ( fopen_s(&fid, file, "r") ) {

fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: ");

_getch(); return -1; }

if ( fopen_s(&fid2, file2, "w") ) {

fprintf(stdout, "\n\t File could not be opened\n"); printf("\n Press any key: ");

_getch(); return -1; }

// Вывод на консоль

printf("\n %s\t %s\t\t %5s", "The number of cell","Name","Sum");

// Чтение из файла data7.dat

fscanf_s(fid, "%d%s%Lf", &number, name, MAX, &sum); fprintf(fid2, "\r\n %s\t\t %s\t\t %5s\r\n", "The number of

cell", "Name", "Sum");

210

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]