- •Тема. Створення та оброблення файлів даних
- •Основні функції, константи, типи та макроси для роботи з файлами
- •Оголошення змінних типу файл
- •Відкриття файлу
- •Використання функцій fread() та fwrite()
- •Функції fscanf() та fprintf()
- •Стандартні потоки
- •Перенаправлення потоків
- •Зчитування та запис текстових файлів
- •Зчитування та запис двійкових (бінарних) файлів Функції get() та put()
- •Функції read() та write()
Функції fscanf() та fprintf()
Для зчитування та запису у файл за визначеним форматом використовують функції fscanf() та fprintf(). Як правило використовуються для файлів відкритих у текстовому режимі.
Загальний вигляд функції зчитування:
int count = fscanf(FILE *fp, char format, a,b,...)
Загальний вигляд функції запису:
int count = fprintf(FILE *fp, char format, a,b,...)
Параметри функцій:
value – змінна в яку буде зчитано інформацію з файлу;
count – кількість записаних (зчитаних) даних;
fp – вказівник на раніше відкритий потік.
size – максимальна кількість зчитаних даних;
a,b,.. – змінні для запису/зчитування даних у файл.
format – формат зчитування (запису) даних, наприклад "%d";
При форсуванні формату зчитування використовуються наступні специфікації:
%d – ціле число;
%f – дійсне число;
%s – символьний рядок;
%c – символ;
%u – безнакове ціле число;
%[множина символів, що необхідно зчитати]
\r – повернення курсору на початок рядка;
\n – перехід на новий рядок.
Для визначення довжини зчитує мого результату задається його розмір, наприклад %2d, %4.2f, %20s,
Формат зчитування та запису повинен співпадати, що забезпечує коректне виконання операцій при їх виконанні.
Приклад ілюструю зчитування та запис з використанням функцій fscanf() та fprintf().
#include <stdio.h> using namespace std; int main() { |
|
FILE *f; char str[80]; f=fopen("c:\\test.txt", " w+"); if(f != NULL) { |
|
int fa = 1; for (int i=1; i<=10; ++i) { fprintf(f, "i=%d, i^2=%d, factorial(%d)=%d\n", i, i*i, i, fa*=i); } |
|
rewind(f); |
|
int n, sq, L, fact; while (!feof(f)) { fscanf(f,"i=%d, i^2=%d, factorial(%d)=%d ", &n, &sq, &L, &fact); //printf("i=%d, i^2=%d, factorial(%d)=%d \n", n, sq, L, fact); //printf("i=%d, factorial=%d \n", n, fact); printf("factorial(%d)=%d \n", n, fact); } |
|
} else printf("Error \n"); fclose(f); return 0; } |
|
Результат запису у файл:
Результат зчитування з файлу:
Приклад: Необхідно прочитати з заданого файлу матрицю, розмірність якої записана в першому рядку. Потім записана матриця. Після йде символьний рядок «25 54.32E-1 Thompson 56789 0123 56», що зчитується за заданим форматом у шість параметрів. В кінці файлу задано символьний рядок, що необхідно зчитати з заду на перед. Приклад демонструє використання функцій зчитуваня у форматному вигляді та переведення курсору.
Вхідний файл:
3 та 4 задано розмірність матриці 3х4.
#include <stdio.h> int main() { int i, j, d, n=0, m=0, k=0; long L, p; float x, y; char str1[10], str2[4]; char ch; float a[50][50]; FILE *f; |
|
f=fopen("c:\\fm.txt", "r+"); if(f != NULL) { |
//відкриваємо файл для зчитування в текстовому режимі |
fscanf(f,"%d",&n); fscanf(f,"%d",&m); |
// зчитуємо по одному цілі числа, що визначають розмірність матриці |
for(i=0;i<n;i++) for(j=0;j<m;j++) fscanf(f,"%f",&a[i][j]); |
//зчитуємо дійсні числа по одному в елементи матриці |
printf("Матриця A[%d,%d]:\n",n,m); for(i=0;i<n;i++) { for(j=0;j<m;j++) printf(" %3.1f ",a[i][j]); printf("\n"); } |
//друкуємо сформовану матрицю |
printf("Позиція курсору = %ld\n ",ftell(f)); |
//визначаємо поточну позицію курсору у файлі |
k=fscanf(f, "%d%f%9s%2d%f%*d %3[0-9]", &i, &x, str1, &j, &y, str2); |
//зчитуємо у змінні дані за заданими параметрами |
printf("Converted %d fields:\n i = %d\n" " x = %5.2f\n str1 = %s\n" " j = %d\n y = %5.2f\n str2 = %s\n", k, i, x, str1, j, y, str2); |
//виводимо зчитані дані з файлу на екран |
L = ftell(f); printf("Позиція курсору = %ld\n ",L); |
//визначаємо поточну позицію курсору у файлі |
fseek(f,0,SEEK_END); |
// переводимо курсор в кінець файлу |
d = ftell(f)-L; printf("Довжина останнього " " символьного рядка = %ld\n ",d);
|
// визначаємо довжину останнього символьного рядка з різниці між усіх символів (ftell(f)) – поточної позиції, що визначили до того (L) |
for(int i = 1;i < d;i++) { fseek(f,-i,SEEK_END); ch = getc(f); putchar(ch); } |
/зчитуємо по одному символу та виводимо на екран останній символьний рядок, для цього вказуємо перед зчитуванням вказуємо позицію командою fseek(f,-i,SEEK_END) – кожен раз функція вказує зміщення з кінця файлу. |
printf("\n Позиція курсору = %ld\n ", ftell(f)); |
//визначаємо поточну позицію курсору у файлі |
for(int i = 1;i < d;i++) { ch = getc(f); printf("Символ [%d] = %c\n ",ftell(f), ch); } |
/зчитуємо по одному символу символьний рядок та виводимо на екран позицію символу. |
} fclose(f); } |
|
Результат виконання:
Матриця A[3,4]:
3.4 4.5 5.4 2.1
3.4 56.0 6.0 9.1
5.4 6.0 3.0 3.5
Позиція курсору = 47
Converted 6 fields:
i = 25
x = 5.43
str1 = Thompson
j = 56
y = 789.00
str2 = 56
Позиція курсору = 83
Довжина останнього символьного рядка = 13
.++C evol I
Позиція курсору = 85
Символ [86] = I
Символ [87] =
Символ [88] = l
Символ [89] = o
Символ [90] = v
Символ [91] = e
Символ [92] =
Символ [93] = C
Символ [94] = +
Символ [95] = +
Символ [96] = .
Символ [96] =