C Files I/O: Създаване, отваряне, четене, запис и затваряне на файл

⚡ Умно обобщение

Работата с файлове в C съхранява постоянни данни на диск чрез библиотеката stdio, която отваря файл с fopen, записва с fputc, fputs или fprintf, чете с fgetc, fgets или fscanf и го затваря с fclose.

  • 📁 Режими на файлове: Низът за режим, подаден на fopen — r, w, a, r+, w+ или a+ — определя дали файлът ще бъде прочетен, презаписан или добавен.
  • ✍️ Записване на данни: fputc записва един символ, fputs записва низ, а fprintf записва форматиран текст в указателя на файла.
  • 📖 Четене на данни: fgetc чете символ, fgets чете ред в буфер, а fscanf анализира форматирани токени от файла.
  • 🔒 Затваряне на файлове: fclose изчиства буферираните данни и освобождава файла, връщайки 0 при успех и EOF при неуспех.
  • 🔁 Интерактивен вход/изход: Функциите getc и putc обработват по един символ, като преместват входните данни директно във файл и обратно.
  • 🤖 AI помощ: GitHub Copilot и AI асистентите генерират рутини fopen, fprintf и fgets и маркират липсващи NULL проверки или незатворени файлове.

C файлове I/O

C Управление на файлове

Файлът може да се използва за съхраняване на голям обем постоянни данни. Подобно на много други езици за програмиране, „C“ предлага следното управление на файлове функции,

  1. Създаване на файл
  2. Отваряне на файл
  3. Четене на файл
  4. Писане във файл
  5. Затваряне на файл

Следват най-важните функции за управление на файлове, налични в „C,“

функция цел
fopen() Създаване на файл или отваряне на съществуващ файл
fclose () Затваряне на файл
fprintf() Записване на блок от данни във файл
fscanf () Четене на блокови данни от файл
getc () Чете един символ от файл
putc () Записва един знак във файл
getw () Чете цяло число от файл
putw () Записване на цяло число във файл
fseek () Задава позицията на указател на файл към определено място
ftell () Връща текущата позиция на файлов указател
пренавиване () Задава указателя на файла в началото на файл

Как да създадете файл

Когато искате да работите с файл, първата стъпка е да създадете файл. Файлът не е нищо друго освен място в паметта, където се съхраняват данни.

За да създадете файл в програма "C" се използва следният синтаксис,

FILE *fp;
fp = fopen ("file_name", "mode");

В горния синтаксис файлът е структура от данни, която е дефинирана в стандартната библиотека.

fopen е стандартна функция, която се използва за отваряне на файл.

  • Ако файлът не присъства в системата, той се създава и след това се отваря.
  • Ако даден файл вече съществува в системата, той се отваря директно с помощта на тази функция.

fp е файл показалка който сочи към файла с типове.

Всеки път, когато отваряте или създавате файл, трябва да посочите какво ще правите с файла. Файл в програмирането на C може да бъде създаден или отворен за целите на четене/запис. Използва се режим, за да укажете дали искате да отворите файл за някоя от посочените по-долу цели. Следват различните типове режими в програмирането на C, които могат да се използват при работа с файл.

Файлов режим Descriptйон
r Отворете файл за четене. Ако даден файл е в режим на четене, тогава никакви данни не се изтриват, ако файлът вече присъства в системата.
w Отворете файл за писане. Ако даден файл е в режим на запис, тогава се създава нов файл, ако файл изобщо не съществува. Ако даден файл вече присъства в системата, тогава всички данни във файла се съкращават и той се отваря за целите на писане.
a Отваряне на файл в режим на добавяне. Ако даден файл е в режим на добавяне, тогава файлът се отваря. Съдържанието във файла не се променя.
r+ отворен за четене и писане от самото начало
w+ отворен за четене и писане, презаписване на файл
a+ отворен за четене и запис, добавяне към файл

В дадения синтаксис името на файла и режимът са посочени като струни следователно те винаги трябва да бъдат оградени в двойни кавички.

Например:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Изход:

Файлът се създава в същата папка, в която сте запазили кода си.

Създаване на файл в изхода на C програма

Можете да посочите пътя, където искате да създадете вашия файл

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Създаване на файл с указан път в C

Как да затворите файл

Човек винаги трябва да затваря файл, когато операциите с него са приключили. Това означава, че съдържанието и връзките към файла са прекратени. Това предотвратява случайно увреждане на файла.

'C' предоставя функцията fclose за извършване на операция за затваряне на файл. Синтаксисът на fclose е следният,

fclose (file_pointer);

Например:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

Функцията fclose приема указател към файл като аргумент. Файлът, свързан с указателя към файл, след това се затваря с помощта на функцията fclose. Тя връща 0, ако затварянето е било успешно, и EOF (край на файла), ако е възникнала грешка при затварянето на файла.

След затваряне на файла същият файлов указател може да се използва и с други файлове.

При програмирането на C файловете се затварят автоматично, когато програмата бъде прекратена. Затварянето на файл ръчно чрез писане на функция fclose е добра практика за програмиране.

Записване във файл

В C, когато пишете във файл, знаците за нов ред '\n' трябва да бъдат изрично добавени.

Библиотеката stdio предлага необходимите функции за запис във файл:

  • fputc(char, file_pointer): Записва символ във файла, към който сочи file_pointer.
  • fputs(str, file_pointer): Записва низ във файла, към който сочи file_pointer.
  • fprintf(file_pointer, str, variable_lists): Отпечатва низ във файла, към който сочи file_pointer. Низът може по избор да включва спецификатори на формат и списък с променливи variable_lists.

Програмата по-долу показва как да извършите запис във файл:

Функция fputc():

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

Изход:

Изход на функцията fputc() в C

Горната програма записва по един символ във файла fputc_test.txt, докато достигне символа на следващия ред „\n“, което показва, че изречението е успешно написано. Процесът е да се вземе всеки символ от масива и да се запише във файла.

Съдържанието на файла fputc_test.txt, написано на C

  1. В горната програма създадохме и отворихме файл, наречен fputc_test.txt в режим на запис, и декларирахме нашия низ, който ще бъде записан във файла.
  2. Извършваме операция за запис на знак по знак, като използваме цикъл for и поставяме всеки знак в нашия файл, докато се срещне символът „\n“, след което файлът се затваря с помощта на функцията fclose.

fputs () Функция:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

Изход:

Изход на функцията fputs() в C

Съдържанието на файла fputs_test.txt в C

  1. В горната програма създадохме и отворихме файл, наречен fputs_test.txt в режим на запис.
  2. След като извършим операция за запис, използвайки функцията fputs(), като запишем три различни низа
  3. След това файлът се затваря с помощта на функцията fclose.

fprintf() Функция:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

Изход:

Изход на функцията fprintf() в C

Съдържание на файла fprintf_test.txt в C

  1. В горната програма създадохме и отворихме файл, наречен fprintf_test.txt в режим на запис.
  2. След извършване на операция за запис с помощта на функцията fprintf() чрез запис на низ, тогава файлът се затваря с помощта на функцията fclose.

Четене на данни от файл

Има три различни функции, предназначени за четене на данни от файл

  • fgetc(file_pointer): Връща следващия символ от файла, към който сочи файловият указател. Когато се достигне краят на файла, EOF се изпраща обратно.
  • fgets(buffer, n, file_pointer): Чете n-1 символа от файла и съхранява низа в буфер, в който NULL символът '\0' е добавен като последен символ.
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): Използва се за разбор и анализ на данни. Чете символи от файла и присвоява входа на списък с променливи variable_adresses, използвайки спецификатори за преобразуване. Имайте предвид, че както при scanf, fscanf спира четенето на низ, когато се срещне интервал или нов ред.

Следната програма демонстрира четене от файла fputs_test.txt, използвайки съответно функциите fgets(),fscanf() и fgetc():

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Резултат:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Четене на данни от файл в C изход

  1. В горната програма отворихме файла с име „fprintf_test.txt“, който преди това беше написан с помощта на функцията fprintf() и съдържа „Изучаване на C с…“ Guru99” низ. Четем го с помощта на функцията fgets(), която чете ред по ред, като размерът на буфера трябва да е достатъчен за обработка на целия ред.
  2. Отваряме файла отново, за да нулираме указателя на файла, така че да сочи в началото на файла. Създаваме различни променливи тип „низове“, за да обработваме всяка дума поотделно. Извеждаме променливите, за да видим тяхното съдържание. Функцията fscanf() се използва главно за...tract и анализира данни от файл.
  3. Отворете отново файла, за да нулирате указателния файл да сочи в началото на файла. Прочетете данните и ги отпечатайте от файла символ по знак, като използвате функцията getc(), докато се срещне операторът EOF
  4. След извършване на операция за четене на файл, използвайки различни варианти, ние отново затворихме файла с помощта на функцията fclose.

Интерактивно четене и запис на файлове с getc и putc

Това са най-простите операции с файлове. Getc означава знак за получаване, а putc означава знак за поставяне. Тези две функции се използват за обработка само на един знак наведнъж.

Следната програма демонстрира функциите за обработка на файлове в програмирането на "C":

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

Изход:

Интерактивно четене и запис на файлове в C изход

Изход за обработка на файлове getc и putc в C

  1. В горната програма създадохме и отворихме файл, наречен demo в режим на запис.
  2. След извършване на операция за запис, файлът се затваря с помощта на функцията fclose.
  3. Отново отворихме файл, който вече съдържа данни в режим на четене. Ще се изпълни цикъл while, докато не бъде намерен eof. След като бъде намерен краят на файла, операцията ще бъде прекратена и данните ще бъдат показани с помощта на функцията printf.
  4. След извършване на операция за четене файлът отново се затваря с помощта на функцията fclose.

Въпроси и Отговори

Текстовият режим преобразува символите за нов ред, за да съответстват на операционната система, докато двоичният режим, отворен с „rb“ или „wb“, записва байтовете точно такива, каквито са. Използвайте двоичен режим за изображения, аудио или всякакви данни, където трябва да се запази точното разположение на байтовете.

Функцията fopen връща NULL, когато файлът не може да бъде отворен, например липсващ файл, отказано разрешение или пълен диск. Винаги проверявайте върнатия указател спрямо NULL преди четене или запис, в противен случай програмата използва невалиден указател и обикновено се срива.

Режимът на запис „w“ отрязва съществуващ файл, изтривайки съдържанието му преди запис, и създава файла, когато то отсъства. Режимът на добавяне „a“ запазва съществуващите данни и добавя ново съдържание в края, така че нищо вече съхранено не се губи.

Функцията fseek премества показалеца на файла до байтово отместване, измерено от SEEK_SET, SEEK_CUR или SEEK_END. Функцията ftell връща текущата байтова позиция на показалеца, а функцията rewind го връща обратно в началото на файла. Заедно те осигуряват произволен достъп, вместо последователно четене.

fgets чете цял ред, стопping на нов ред или след n-1 символа, така че да се съобразява с размера на буфера. fscanf чете форматирани, разделени с интервали токени и може да препълни малък масив. За безопасно четене на цели редове, fgets е по-добрият избор.

EOF е константа, обикновено -1, която маркира края на файл. Функции за четене като getc, fgetc и fscanf връщат EOF, след като не останат повече данни, поради което циклите сравняват резултата си с EOF, за да спрат четенето.

Да. Асистент по кодиране с изкуствен интелект може да генерира рутини fopen, fprintf и fgets от команден ред на разбираем език, да обясни всеки файлов режим и да открие грешки, като например липсваща NULL проверка или незатворен файл. Винаги компилирайте и тествайте предложения от изкуствен интелект код, преди да му се доверите.

Копилот на GitHub пише код за обработка на C файлове, предлагайки пълни блокове fopen, fputs и fscanf от кратък коментар или име на функция. Често добавя съответстващото извикване на fclose и проверка за грешки, въпреки че все пак трябва да прегледате генерираната логика.

Обобщете тази публикация с: