Робота з файлами в сі введення та виведення у файл у сі
У цій статті ми дізнаємося, як зчитувати дані з файлів та записувати інформацію у файли у програмах сі. Файли в сі використовуються для того, щоб зберігати результат роботи програми сі і використовувати його при новому запуску програми. Наприклад, можна зберігати результати обчислень, статистику ігор.
Щоб працювати з файлами в сі необхідно підключити бібліотеку stdio.h
#include
Щоб працювати з файлом в сі необхідно задати покажчик на файл за зразком
FILE *ім'я покажчика на файл;
Наприклад
FILE * fin;
Вказує покажчик fin на файл
Далі необхідно відкрити файл та прив'язати його до файлового покажчика. Для відкриття файлу в си на читання використовується команда
Ім'я покажчика на файл = fopen ("шлях до файлу", "r");
Наприклад, наступна команда
fin = fopen("C:\Users\user\Desktop\data.txt", "r");
відкриє файл data.txt, що знаходиться на робочому столі на шляху C:UsersuserDesktop Щоб дізнатися шлях до файлу, можна вибрати файл мишею натиснути на праву кнопку миші і вибрати властивості файлу. У розділі Розташування буде вказано шлях до файлу. Зверніть увагу, що в цей шлях вказується за допомогою двох слішів.
Після роботи з файлом в сі необхідно його закрити за допомогою команди
fclose(ім'я покажчика на файл)
Зчитування інформації з текстового файлу в Сі
Щоб можна було зчитувати російські символи з файлу, необхідно налаштувати роботу з Кирилицею за допомогою команди
setlocale(LC_ALL, "Російський");
При цьому необхідно на початку програми підключити #include
Оператор fscanf()
Для зчитування слова з файлу в сі використовується команда fscanf(). Ця команда аналогічна команді введення інформації з клавіатури в сі scanf() тільки перший параметр це покажчик на файл
fscanf (покажчик на файл, "% формат введення даних 1% формат введення даних 2 ...", & Змінна 1, & Змінна 2 ...);
Наприклад команда
fscanf(fin,"%d%d%d",&a,&b,&c);
вважає з файлу, який прив'язаний до покажчика на файл fin рядок з трьох цілих змінних
Розберемо приклад програми, яка зчитує з текстового файлу data.txt в які записані три стовпці цифр інформацію та записує її в масиви. Для кожного шпальти інформації свій масив. Докладно про роботу з масивами Сі.
#include
#include
main()
< int a[10];
int b [10];
int c[10];
int i;
// Визначаємо покажчик на файл
FILE * fin;
// відкриваємо файл для читання
fin = fopen("C:\Users\user\Desktop\data.txt", "r");
// Построкове зчитування з файлу
for (i=0;i <3;i++)
// зчитування рядка з трьох значень файлу та запис у масиви
fscanf(fin,"%d%d%d",&a[i],&b[i],&c[i]);
>
// Виведення масивів на екран
for (i=0;i <3;i++)
printf("%d%d%d\n",a[i],b[i],c[i]);
>
getch();
// Закриття файлу
fclose(fin);
>
Построкове зчитування інформації з файлу в СІ.Функція fgets ( )
Оператор fscanf() зчитує з файлу слово, тобто. до першого зустрічного пропуску.
Щоб рахувати з файлу весь рядок із файлу в Сі використовується конструкція
if ( NULL != fgets (рядкова змінна, довжина рядка, покажчик на файл ) )
дії при зчитуванні рядка
>
Наприклад програма на Сі, яка зчитує два рядки з файлу і виводить їх на екран
#include
#include
#include
main()
// задаємо рядкові пермінні
char st1 [100];
char st2 [100];
//Визначаємо покажчик на файл
FILE * fin;
// налаштовуємо роботу з Кирилицею
setlocale(LC_ALL, "Російський");
// відкриваємо файл для читання
fin = fopen("C:\data.txt", "r");
// зчитуємо перший рядок із файлу
if ( NULL != fgets ( st1, 100, fin ) )
// Виводимо рядок на екран
printf("%s ",st1);>
// зчитуємо другий рядок із файлу
if ( NULL != fgets ( st2, 100, fin ) )
// Виводимо рядок на екран
printf("%s\n",st2);>
// Закриваємо файл на читання
fclose(fin);
>
Запис інформації в текстовий файл у Сі
Для запису даних у файл у Сі, необхідно відкрити файл у режимі запису
Ім'я покажчика на файл = fopen ("шлях до файлу", "w");
Для запису в рядок текстового файлу використовується команда fprnitf(), яка аналогічна команді printf() виведення на екран у си тільки перший параметр це покажчик на файл
fprintf (ім'я покажчика на файл, "% формат введення", змінні);
Наприклад запис у файл out.txt значення змінної а
a=10;
fout = fopen("C:\Users\user\Desktop\out.txt", "w");
fprintf (fout, %d, a);
Приклад програми на сі яка запитує два числа і записує у файл out.txt обидва ці числа та їх суму
main()
< int a;
int b;
int c;
FILE * fout;
fout = fopen("C:\Users\user\Desktop\out.txt", "w");
printf ("введіть перше число \n");
scanf("%d", &a);
printf ("введіть друге число \n");
scanf("%d", &b);
c = a + b;
fprintf(fout, %d %d %d, a, b, c);
getch();
fclose(fout);
>
Вважати число з файлу і записати його в змінну на Сі
Є файл, який містить ціле число і більше нічого, наприклад, 312567. Намагаюся рахувати з нього дані і записати в змінну, а для подальшого використання - нічого не виходить - вже кілька годин різні варіанти використовую. Може хтось допоможе з працюючим прикладом З, т.к. є інший код С, який це значення буде використовувати? Буду радий допомоги. Код такий:
#include // бібліотека виведення на екран int main(void) < int a; FILE *k = fopen("/home/pi/c/file1.txt", "r"); // файл, з якого читаємо значення fscanf(k,"%d%",a); fclose(k); printf("значення %d\n", a); >
Запис та зчитування символів та рядків. Частина 1
Доброї доби! Сьогодні ми поговоримо про рядки та символи в Сі, і про те, як вони передаються у файл.
Спочатку трохи теорії. До цього моменту ми вже розбирали, як передавати змінну на виведення за допомогою специфікаторів формату (%d, %c і т.д.). А також розглядали різні методи відкриття файлів для запису та читання. Тепер давайте узагальним усі варіанти відкриття файлу і, що означає кожне позначення.
Режими читання та запису файлів
У Сі, для відкриття файлу, використовується команда fopen(), в аргументах якого записується ім'я файлу та позначення режиму запису:
r (r+) - файл відкривається для читання (читання та запису);
w (w+) — відкривається порожній файл для запису (читання та запису). Якщо файл з такою назвою існує, він стирається;
a (а+) — файл відкривається для доповнення до кінця (читання та доповнення).
Як приклад: file = fopen("file.tx) .
Специфікатори
Повторимо основну частину функції scanf():
%c Читає одиночні символи
%d Читає десяткове число
%f Читає число з плаваючою комою
%s Читає рядок
Інші функції зчитування розберемо на прикладах.
Завдання на запис та зчитування рядків та символів у Сі
Тепер, коли ми все узагальнили приступимо до завдань на символи та рядки.
Записати в текстовий файл на різних рядках 5 слів та 3 числа, закрити його, а потім дописати туди ще 2 символи.
Це нескладне завдання перевіряє нас на знання тих самих режимів відкриття файлів, про які ми говорили раніше.
#include
#include
int
main(void)
FILE*file; file =
fopen(«file.txt»,»w+»);
char str[200];
int ch1, ch2, ch3;
gets(str);
scanf(«%d%d%d»,
& ch1,& ch2,& ch3);
Для роботи з рядками Сі передбачені різноманітні бібліотеки з різними функціями. У стандартній бібліотеці список таких функцій скромний, але в більшості випадків цього достатньо. gets() аналог функції scanf()Однак він працює тільки з рядком. Записує в зазначений аргумент рядок, що сканується ним, з консолі введення у форматі символів.
Насправді, і звичайні рядки слід сприймати як звичайні одновимірні масиви з форматом char. Також слід врахувати, що розмір масиву (у нас char str[200]) має бути не менше ніж рядок, а краще більше.
fputs(str, file);
fprintf(file,"\n%d,
%d,
%d", ch1,ch2,ch3);
fclose(file);
Зроблено запис у файл зчитаних з консолі рядка та цифр. І закрили файл. ЗАВЖДИ Закрийте файл після відкриття.інакше це може вплинути на працездатність комп'ютера.
file =
fopen("file.txt","a+");
char sym1 =
'R', sym2 =
'T';
fprintf(file,
"
\n
%c
,
%c
", sym1, sym2);
fclose(file);
return EXIT_SUCCESS;
>
Йдемо за завданням і знову відкриваємо файл. Звертаю увагу до режиму відкриття файлу («a+»), записуємо туди 2 символи. І закриваємо файл.
Створити вручну текстовий файл англомовного невеликого об'єму. Прочитати файл символом і вивести на екран усі символи з файлу. Пропустивши рядок, вивести на екран першу та останню літеру кожного рядка у файлі.
Так як має бути складніша робота з рядками, відразу підключимо бібліотеку string.h
#include
stdio.h>
#include
stdlib.h>
#include
string.h>
#define
N 200
int
main(void)
int i =
0;
FILE*file; file =
fopen("file.txt",
"r");
char sym[N], c =
0;
while(
(c =
fgetc(file))
!=
EOF)
printf("%c", c);
>
Після відкриття файлу в режимі читання та ініціалізації змінних, йде код, який стане вам у нагоді в майбутньому. Виведення на екран файлу символічно! В умовах while вказано «поки сканований символ не означає кінець файлу». EOF - символ відомий у С++ як "\0", означає кінець файлу.
fclose(file);
printf("\n"); file =
fopen("file.txt",
"r");
while(
!feof(file))
fscanf(file,"%s",sym); i =
(strlen(sym));
printf("%c
%c
", sym[0], sym[i-1]);
>
fclose(file);
return EXIT_SUCCESS;
>
Умова, що використовується при while, так само як і в попередній статті, однак має більш коротку форму. Функція strlen() з бібліотеки string.h дозволяє визначити довжину рядка. І уявивши, що рядок — одномірний масив, звернемося до конкретних символів через індекс.
Створити вручну текстовий файл англомовного невеликого об'єму. Знайти, скільки всього голосних міститься у цьому файлі. Знайти кількість голосних у кожному рядку файлу. Результати дописати цей же файл на новому рядку.
#include
stdio.h>
#include
stdlib.h>
#include
string.h>
#define
N 100
int
main(void)
int vse =
0, i =
0, k =
0;
FILE*file; file =
fopen("file.txt",
"r");
char c =
0, temp[N];
while(
(c =
fgetc(file))
!=
EOF)
if
((c ==
'A')
||
(c ==
'a')
||
(c ==
'E')
||
(c ==
'e')
||
(c ==
'I')
||
(c ==
'i')
||
(c ==
'O')
||
(c ==
'o')
||
(c==
'Q')
||
(c ==
'q')
||
(c ==
'U')
||
(c ==
'u')
||
(c ==
'Y')
||
(c ==
'y')) vse++;
>
fclose(file);
Насамперед, порахуємо кількість голосних у всьому файлі за допомогою лічильника vse.
file =
fopen("file.txt",
"r"); k =
0;
while
(!feof(file))
fgets(temp, N, file); k++;
>
fclose(file);
Тепер порахуємо кількість рядків, щоб створити одномірний масив з кількістю елементів, що дорівнює кількості рядків.
file =
fopen("file.txt",
"r");
int
* kol;
int j; kol =
(int*)malloc(k *
sizeof(int));
for
(j =
0; j k; j++) kol[j]
=
0;
fgets(temp, N ,file);
for
(i =
0; i
(strlen(temp)); i++)
if
((temp[i]
==
'A')
||
(temp[i]
==
'a')
||
(temp[i]
==
'E')
||
(temp[i]
==
'e')
||
(temp[i]
==
'I')
||
(temp[i]
==
'i')
||
(temp[i]
==
'O')
||
(temp[i]
==
'o')
||
(temp[i]
==
'Q')
||
(temp[i]
==
'q')
||
(temp[i]
==
'U')
||
(temp[i]
==
'u')
||
(temp[i]
==
'Y')
||
(temp[i]
==
'y')) kol[j]++;
>
>
fclose(file);
Не лякайтесь, друзі! Для створення масиву, розмір якого міститься у змінній, використовується команда (int *) malloc (k * sizeof (int)); . Грубо кажучи, ми створили динамічний масив у Сі. У циклі, скануючи по рядку за допомогою fgets() (де temp - Змінна куди записати рядок, N - Кількість символів, file - Назва файлу з яким працюємо), знаходимо в рядку голосні літери. Наприкінці записуємо значення лічильника до нашого масиву.
file =
fopen("file.txt",
"a+");
fprintf(file,"\n");
for
(j =
0; j k; j++)
fprintf(file,"%d
", kol[j]);
>
fprintf(file,"\t
vse
%d", vse);
fclose(file);
free(kol);
return EXIT_SUCCESS;
>
Тепер просто записуємо показання лічильників, що потрібні за завданням, в кінець файлу. Як і у разі закриття файлів, так і при роботі з malloc ЗАВЖДИ звільняйте пам'ять наприкінці програми за допомогою команди free() , де в аргументах ім'я змінної.
На сьогодні все, якщо лишилися питання, пишіть у коментарях. Ось вихідники:
Усі вихідні коди без файлів txt.
Завантажити вихідні завдання — 1
Завантажити вихідні завдання — 2
Завантажити вихідні завдання — 3
Подiлитись посиланням: