Ако сте писали програмата 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 система всичко се третира като файл, което означава, че можете да четете от него и да пишете в него.
Това означава, че вашият принтер може да бъде абстрахиран като файл, тъй като всичко, което правите с принтера, е да пишете с него. Също така е полезно да мислите за тези файлове като за потоци, тъй като, както ще видите по-късно, можете да ги пренасочите с черупката.
И така, как това е свързано с helloworld
IO и подаване на файл?
Когато се обаждате 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!