C Files 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");
}

Изход:

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

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

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

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

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

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

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

'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_test.txt файл, докато достигне символа на следващия ред „\n“, който показва, че изречението е написано успешно. Процесът е да вземете всеки знак от масива и да го запишете във файла.

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

  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);
    }

Изход:

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

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

  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;
    }

Изход:

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

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

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

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

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

  • fgetc(file_pointer): Връща следващия знак от файла, към който сочи указателят на файла. Когато краят на файла е достигнат, EOF се изпраща обратно.
  • fgets(буфер, 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

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

  1. В горната програма отворихме файла, наречен „fprintf_test.txt“, който преди беше написан с помощта на функцията fprintf() и съдържа низ „Learning C with Guru99“. Ние го четем с помощта на функцията fgets(), която чете ред по ред, където размерът на буфера трябва да е достатъчен, за да обработи целия ред.
  2. Отваряме отново файла, за да нулираме файла с указателя да сочи към началото на файла. Създайте различни низови променливи, за да обработвате всяка дума поотделно. Отпечатайте променливите, за да видите тяхното съдържание. fscanf() се използва главно за извличане и анализиране на данни от файл.
  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;
    }

Изход:

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

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

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

Oбобщение

  • Файлът е пространство в паметта, където се съхраняват данни.
  • Програмирането на C предоставя различни функции за работа с файл.
  • Механизъм за манипулиране с файлове се нарича управление на файлове.
  • Файлът трябва да бъде отворен, преди да се извършват операции с него.
  • Файлът може да бъде отворен в режим на четене, запис или добавяне.
  • Функциите getc и putc се използват за четене и запис на един символ.
  • Функцията fscanf() позволява четене и анализ на данни от файл
  • Можем да четем (използвайки getc функция) цял файл чрез цикъл, за да покрие целия файл, докато се срещне EOF
  • Можем да пишем във файл, след като създадем името му, като използваме функцията fprintf() и трябва да има знак за нов ред в края на текста на низа.