Работа с файлове в C - Как да отворите, затворите и запишете във файлове

Ако сте писали програмата C helloworldпреди, вече знаете основния файл I / O в C:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

Работата с файлове е една от най-важните части на програмирането. В C използваме структурен указател от файлов тип, за да декларираме файл:

FILE *fp;

C предоставя редица вградени функции за извършване на основни файлови операции:

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

Отваряне на файл

Най fopen()функция се използва за създаване на файл или отваряне на съществуващ файл:

fp = fopen(const char filename,const char mode);

Има много режими за отваряне на файл:

  • r отваряне на файл в режим на четене -
  • w - отваря или създава текстов файл в режим на запис
  • a - отваря файл в режим на добавяне
  • r+ - отваря файл в режим на четене и запис
  • a+ - отваря файл в режим на четене и запис
  • w+ - отваря файл в режим на четене и запис

Ето пример за четене на данни от файл и запис в него:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

Сега може би си мислите: "Това просто отпечатва текст на екрана. Как е този файл IO?"

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

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

И така, как това е свързано с helloworldIO и подаване на файл?

Когато се обаждате printf, всъщност просто пишете в специален файл, наречен stdout, съкратен от стандартния изход . stdoutпредставлява стандартния изход според решението на вашата обвивка, която обикновено е терминалът. Това обяснява защо е отпечатано на вашия екран.

Има два други потока (т.е. файлове), които са достъпни за вас с усилие stdinи stderr. stdinпредставлява стандартния вход , който вашата черупка обикновено прикрепя към клавиатурата. stderrпредставлява стандартния изход за грешка , който вашата черупка обикновено прикачва към терминала.

Рудиментарен файл IO или Как се научих да полагам тръби

Стига теория, нека се захващаме с работа, като напишем някакъв код! Най - лесният начин да пишете във файл е да пренасочите изходния поток с помощта на инструмента за пренасочване на изход >,.

Ако искате да добавите, можете да използвате >>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

Съдържанието на hello.txtволята, не е изненадващо, ще бъде

Hello, world!

Да кажем, че имаме друга програма, наречена greetподобна на тази helloworld, която ви поздравява с дадено name:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

Вместо да четем от клавиатурата, можем да пренасочим stdinкъм четене от файл с помощта на <инструмента:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

Забележка: тези оператори за пренасочване са в bashи подобни черупки.

Истинска сделка

Горните методи са работили само за най-основните случаи. Ако сте искали да правите по-големи и по-добри неща, вероятно ще искате да работите с файлове от C, вместо през черупката.

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

Режимът е основно разрешения, така че rза четене, wза запис, aза добавяне. Можете също така да ги комбинирате, което rwби означавало, че можете да четете и пишете във файла. Има повече режими, но те са най-често използваните.

След като имате FILEуказател, можете да използвате основно същите IO команди, които бихте използвали, с изключение на това, че трябва да ги добавите с префикс fи първият аргумент ще бъде файловият указател. Например printfверсията на файла на fprintf.

Ето програма, наречена, greetingsкоято чете a от файл, съдържащ списък с имена, и записва поздравленията в друг файл:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

Да предположим, че names.txtсъдържа следното:

Kamala Logan Carol

След това след стартиране greetingsфайлът greet.txtще съдържа:

Hello, Kamala! Hello, Logan! Hello, Carol!