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

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

1. В папке, где расположен выполняемый файл (*.ехе), соз­ дать текстовый файл input.txt.

2.Заполнить его любой текстовой информацией.

3.Запустить программу.

#include<conio.h>

#include<stdio.h> main()

{FILE *f; char ch;

//открываем файл для чтения f = fopen("input.txt","r");

//пока не будет достигнут конец файла while(ch!=EOF)

{ch = getc(f); //читаем символ из файла //или ch = fgetc(f);

putchar(ch); //выводим символ на консоль

}

fclose(f); //закрываем файл

getch(); return 0;

}

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

/ореп("имя вложенной папки \\ имя файла", "г");

Например,

f = fopen (п123 Winput .txtn,"г" );

Если файл находится вообще в другом каталоге, то путь нуж­ но указывать полностью, например

f = fopen ("С:\\Newl\New2\\New3\\file.txt", "г");

Если файл для чтения не найден, то произойдет ошибка, по­ этому этот вариант желательно предусматривать в программном коде.

Пример. Использование проверки при открытии файла.

#include<conio.h>

#include<stdio.h>

#include<stdlib.h> main()

{FILE *f; char ch;

f = fopen("C:\\New\\input.txt","r"); if(f==NULL)

{puts("Ошибка! Файл не найден!"); getch() ;

exit(1);

}

while(ch!=EOF)

{ch = getc(f);

putchar(ch);

}

fclose(f);

getch();

return 0;

}

Запись символа ch в файл, с которым связан указатель fp , производится функциями

intputc(int ch, FILE *fp) intfputc(int ch, FILE *fp)

Если операция была успешной, то возвращается записанный символ. В случае возникновения ошибки возвращается символ

EOF.

Пример. Вывод информации с консоли в файл.

При выполнении примера выполните следующие действия:

1. Запустить программу и набрать через консоль любую ин­ формацию (клавишу q не нажимать).

2.Нажать клавиши q и Enter.

3.Зайти в папку, где расположена программа, и открыть соз­ данный файл output.txt.

#include<conio.h>

#include<stdio.h> main()

{FILE *f; char ch;

//открываем файл для записи f = fopen("output.txt","w");

do

{ch = getchar (); //считываем с консоли символ putc(ch, f); //выводим его в файл

//также можно применить fputc(ch,f) }while(ch!= 'q*); //пока не нажмем клавишу q

fclose(f);

return 0;

}

Для определения конца файла также можно использовать функциюfeo f с прототипом

intfeof(FILE *Jp)

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

char ch;

FILE *fp;

//откр ы в аем файл для чтения fp = fo p e n ( " in p u t . t x t " , "г " ) ;

w h i le ( ! f e o f ( f p ) ) {ch = g e t c (fp ); putchar(ch);

}

//пока не достигнут конец файла //считываем символ из файла //выводим его на консоль

f c lo s e ( f p ) ; //закрываем файл

Чтение из файла и запись строки str в файл удобно осуществ­ лять функциями

char *fgets(char *str, intnum, FILE *fp) intfputs(const char *str, FILE *fp)

Функцияfgets считывает из файла не более пит - 1 символов. По завершении чтения символов сразу же за последним из них ав­ томатически размещается символ конца строки '\0\

#i n c l u d e < c o n i o . h>

#i n c l u d e < s t d i o . h> m a i n ()

{FILE

*f;

char

s i [50]="11111 aa 222 bbbbbbb";

char

s2 [ 5 0 ] ;

//открываем

файл для записи

 

f = f o p e n ("f i l e . t x t " , "w");

 

f p u t s ( s l , f ) ; //выводим строку

в файл

f c l o s e ( f ) ;

//закр ы в аем файл

 

//открываем

файл для чтения

 

f = f o p e n ( " f i l e . t x t " , " r " ) ;

 

/ /ч и т а е м 10

символов строки из

файла

f g e t s ( s 2 , 1 1 , f );

 

f c l o s e ( f ) ;

//закр ы в аем файл

 

puts(s2); //выводим строку на консоль

getch();

return 0;

}

Результат на экране:

11111 аа 2

Для чтения и записи блоков данных предусмотрены функ­ цииfread иfwrite:

unsignedfread (void *f unsigned sizeelm, unsigned n, FILE *fp) unsignedfwrite (void *f unsignedsizeelm, unsigned n, FILE *fp)

Здесь f - указатель на объект (например, массив), в который или из которого будут записываться данные; sizeelm - длина каж­ дой единицы записи в байтах; п - количество единиц записи;fp - ука­ затель на соответствующий файл. Запись сначала ведется в буфер обмена, вывод в файл начинается только после переполнения бу­ фера.

Пример. Запись блока данных в файл.

#include<conio.h>

#include<stdio.h>

main()

{char s [50]; int n; float a; FILE *file;

//открываем файл для записи file = fopen("out.txt","wb");

puts("Введите текст:"); gets (s);

puts("Введите дробное число:"); scanf("%f", &a);

//определяем число символов в строке n=strlen(s);

//запись целого числа fwrite(&n,sizeof(int),1,file); //запись строки fwrite(&s,sizeof(char) ,n,file); //запись дробного числа fwrite(&a,sizeof(float),1,file);

fclose(file); //закрываем файл

getch(); return 0;

}

Если посмотреть созданный программой файл out.txt, то целое и дробное числа будут представлены в бинарном виде (поскольку файл был открыт в двоичном режиме обмена wb).

Пример. Чтение блока данных из файла.

Если файл out.txt не создан, выполните предыдущий пример.

#include<conio.h>

#include<stdio.h>

main()

{char s [50]; int n; float a; FILE *file;

//открываем файл для чтения file = fopen("out.txt"f"rb”);

//чтение числа символов в строке fread(&n,sizeof(int),1,file); //чтение строки fread(&s,sizeof(char),n, file);

//чтение дробного числа fread(&a,sizeof(float),1,file) ;

s[n]=,\Of; //ставим символ конца строки puts(s); //печатаем строку printf("%f",а); //печатаем дробное число

fclose(file); //закрываем файл

getch(); return 0;

}

Поскольку файл out.txt был создан в двоичном режиме, чи­ таться он должен тоже в двоичном режиме (rb\ иначе представле­ ние данных при выводе на консоль будет неверным.

Также обратите внимание, что при заполнении символьного массива функциейJread символ конца строки '\0' автоматически не ставится, это нужно сделать самому. Закомментируйте строку s [ n ] = '\0 и посмотрите, что получится при выводе символьного массива s на консоль.

Форматированный ввод-вывод в файл осуществляется функ­ циями fprintf и fscanf, которые работают аналогично функциям printf и scarify за тем исключением, что связаны с файлами на дис­ ке. Прототипы этих функций соответственно

intjprintf(FILE *fp, const char *str,...) mtjscanf(FILE *fp, const char *str}...)

Здесь jp - указатель на файл; str - форматная строка (см. лек­ цию 3);... - список аргументов (см. лекцию 3).

Пример. Отсортировать хранящийся в файле массив по убы­ ванию.

При решении примера выполните следующие действия:

1. В папке, где расположен выполняемый файл (*.ехе\ соз­ дать текстовый файл massiv.txt.

2. Заполнить его значениями

изакрыть.

3.Запустить программу.

4.Открыть файл massiv.txt и проверить полученный резуль­

тат.

#include<conio.h>

#include<stdio.h>

main()

{int a [7], i,j,N=7,n=N,b ; FILE *f;

//открываем файл для чтения f = fopen("massiv.txt",Mr");

for(i=0;i<n;i++)

fscanf (f,1%d",&a [i] ); //поэлементно считываем //массив из файла

//сортируем массив методом «пузырька» for(i=l;i<N;i++,n— )

for(j=l;j<n;j++) if (a[j]>a[j-l] )

{b=a[j]; a[j]=a[j-1] ; a [j-1]=b;

}

fclose(f); //закрываем файл для чтения

f = fopen("massiv.txt”,"a"); //открываем файл

//для дописывания в конец fprintf(f,"\n"); //переводим в файле курсор

//в новую строку

for(i=0;i<N;i++)

fprintf(f,"%4d",a[i]); //поэлементно считываем

//массив из файла

fclose(f); //закрываем файл getch();

return 0;

В результате файл massiv.txt будет иметь вид

1 7 -2 11 0 19 6

19 11 7 6 1 О -2

Чтение и запись в файл необязательно делать последова­ тельно, можно это делать непосредственно доступом к нужному элементу файла с помощью функции fseek, которая устанавливает указатель позиции файла в нужное место. Прототип этой функции имеет вид

mtfeeek(FlLE *jp, longnumbytes, intorigin)

Здесь fp - указатель на файл; numbytes - количество байтов от точки отсчета для установки текущей позиции указателя файла; ori­ gin - макрос или соответствующее ему значение (табл. 12.3).

 

 

Т а б л и ц а 12.3

Возможные значения параметра origin функцииfseek

Точка отсчета

Макрос

Значение

Начало файла

SEEK_SET

0

Текущая позиция

SEEK_CUR

1

Конец файла

SEEKEND

2

Пример. Использование функцииfseek.

#include<conio.h>

#include<stdio.h>

main() {int n;

FILE *f = fopen("out.txt", V );

char sl[]=ffll 111 111 111 Iй;

char s2[]="2 22";

fputs(sl/f);

fseek (f, 5,2) ; //сдвиг на 5 байт от конца //предыдущего текста

fputs(s2,f);

getch();

return 0;

}

В результате работы программы внутри файла out.txt нахо­ дится текст

11

111

111

111

1

2

22

Текст 2 22 сдвинут на пять пробелов относительно текста 11 111 111 111 1, поскольку одному символу соответствует один байт.

Функция rewind устанавливает индикатор позиции на начало файла. Прототип функции имеет вид

voidrewind(FILE *jp)

Пример. Использование функции rewind.

#include<conio.h>

#include<stdio.h>

main() {int n;

FILE *f = fopen("file.txt","w"); char sl[]=f,ll 111 111 111 Iй; char s2[]="2 22";

n = strlen(si); fwrite(&sl,sizeof(char),n,f);

// установить внутренний указатель файла в начало rewind(f);

n = strlen(s2); fwrite(&s2,sizeof(char) ,n, f);

getch(); return 0;

}