книги / Язык Си
..pdf1. В папке, где расположен выполняемый файл (*.ехе), соз дать текстовый файл 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;
}