Основни операции с файлове. Търсене на низ във файл ред по ред

Основните операции с файлове като отваряне, писане и четене са основна част от всеки език за програмиране. В тази статия ще направим сравнение между имплементациите в няколко езика: C, C++, PHP, Java, Perl, Bash и Python. Ще разгледаме решението на една и съща задача.


Задачата


Имаме файл input.txt. Трябва да генерираме файл output.txt, който съдържа всички редове от input.txt, в които присъства низа "myWord".


Четене и писане на текстови файлове в C

file-operations.c


gcc -o fops.exe file-operations.c && ./fops.exe && cat output.txt

В този пример ползваме fopen за отварянето и на двата файла - за четене и за писане. Ако дадена операция генерира грешка, функцията perror връща детайли за грешката. После подаваме файловите дескриптори и търсения низ на функцията filter_file. Тя прочита входния файл ред по ред чрез функцията fgets. После претърсва всеки ред посредством strstr. Ако се намери търсения низ, целия ред се записва в изходния файл с fwrite. Забележете, че не добавяме нов ред след записване тъй като fgets чете целия ред заедно със символа за край на ред.


Четене и писане на текстови файлове в C++

file-operations.cpp


Забележете колко подобен е кода с този на C. Нека разгледаме какво е променено. Първо, използваме потоци вместо файлови указатели - ifstream за четене от файл и ofstream за писане във файл. Char буферите са заменени с обекти string, като това дава възможност да ползваме string::find() за търсене. Тъй като в C++ getline не връща знака за нов ред както fgets, е необходимо да добавим endl след всеки ред във файла с резултата.

Четене и писане на текстови файлове в PHP

file-operations.php.txt


Кодът е почти като на C, с изключение на факта, че в PHP променливите нямат тип и не се налага такъв да бъде дефиниран.

Четене и писане на текстови файлове в Java

FileFilter.java


Да разгледаме класа FileFilter. Конструктора му приема име на входен и изходен файл и търсения низ и инициализира член променливите. Основната логика е в метода filter() Входа се чете чрез BufferedReader.readLine(), а изхода се пише посредством PrintWriter.println(). Те от своя страна използват FileReader и FileWriter за достъп до файловете. Търсенето е посредством String.contains().

Четене и писане на текстови файлове в Perl

file-operations.pl


Както почти всичко на Perl, имплементацията на нашата задача е доста кратка. Основната логика е във функцията filter. Първо изчитаме трите входни параметъра с shift. Отваряме два файлови указателя FPIN за вход и FPOUT за изход. Забележете символа ">" преди името на файла. Той определя, че този файл е отворен за писане. Четенето е посредством <FPIN> указателя. Функцията index() връща първия индекс на даден подниз в низ. Тук също не добавяме нов ред при записване.

Четене и писане на текстови файлове в Bash

file-operations.sh


Bash предлага голямо разнообразие от инструменти за филтриране на файлове, така че горната задача може да се сведе до един ред:

grep myString input.txt > output.txt

Нека обаче покажем един метод, подобен по идея на горните  примери. Първо изтриваме евентуално предишно съдържание в изходния файл и създаваме празен. После ползваме read с пренасочен вход за прочитане на файла ред по ред в променливата $line. После проверяваме дали реда съдържа търсения низ и евентуално добавяме към изхода.

Четене и писане на текстови файлове в Python

file-operations.py


Отново познатия метод тук. Функцията filter() извършва основната дейност по отваряне на файловете и филтриране на съдържанието. Когато ползваме with за отваряне на файлове, си гарантираме, че файловете ще се затворят автоматично, когато изпълнението изпълнението излезе извън конструкцията без значение дали поради изключение или при нормално завършване. Това е съкратен вариант на try/finally конструкцията. Друг метод, който си заслужава да се отбележи, е итерирането по редовете на файла чрез for конструкция.
 

Добави коментар (вече работи)

Няма коментари

Обратно към списъка със статиите

Тази страница последно е променяна на 2014-07-23 07:48:10