Передать имя файла в качестве параметра
Для написания большинства сложных программ требуется обмен данными с файлами. В этой главе мы рассмотрим только текстовые файлы, для работы с бинарными и типизированными файлами см. специальную литературу и гл. 22.
21.1. Общие операции
Для работы с каждым файлом описывается переменная типа text :
Ее называют файловой переменной. Если программа обрабатывает несколько файлов одновременно, для каждого из них описывается такая переменная. Можно использовать и одну переменную для нескольких файлов, если они обрабатываются последовательно, и каждый следующий файл открывается после завершения работы с предыдущим. Вся работа с файлом происходит через файловую переменную, имя файла указывается только один раз следующим оператором:
assign ( f ,'имя_файла');
где f -- ранее описанная файловая переменная.
Этот оператор предшествует открытию файла и связывает переменную с файлом на жестком или гибком диске. В качестве имени файла может быть указан абсолютный или относительный путь к файлу на жестком или сменном диске:
assign ( f ,' data . txt ');
-- будет открываться файл с именем data . txt из текущей папки;
-- будет открыт файл с именем my . dat из корневой папки дискеты.
Имя файла также может быть введено пользователем с клавиатуры:
var name:string; f:text;
writeln ('Введите имя файла:');
Наконец, имя файла можно передать программе параметром командной строки (см. п. 5.3).
После связывания следует открыть файл. Каждый файл может быть открыт только в одном из трех режимов -- для чтения данных, для записи новых данных (при этом, если файл уже существовал, его прежнее содержимое будет стерто) или для добавления данных в конец файла. Если требуется сначала прочитать данные из файла, а потом переписать этот же файл, следует открыть файл для чтения, после чтения закрыть его и вновь открыть для записи. Открытие файла выполняется одним из трех операторов:
reset ( f ); -- открыть для чтения;
rewrite ( f ); -- открыть для записи;
append ( f ); -- открыть для добавления.
Чтение или запись данных осуществляется знакомыми нам операторами read , readln , write и writeln , но первым параметром этих стандартных процедур указывается имя файловой переменной:
var a,b,c:real; f1,f2:text;
и перевод строки в файл write . txt >
После того, как все операции с файлом выполнены, его следует закрыть, особенно если происходила запись или добавление данных:
- закрыли файл, связанный с файловой переменной f .
При работе с файлами могут возникнуть ошибки, связанные как с отсутствием нужного файла на диске, так и с проблемами чтения или записи (например, мы пытаемся открыть файл для записи на защищенном диске). Поэтому операторы открытия файла и чтения или записи данных следует защищать директивой компилятора . , а после оператора проверять статус операции ввода-вывода с помощью стандартной функции IoResult :
var f:text; name,s:string;
writeln ('Введите имя файла:');
if IoResult<>0 then begin
writeln ('Не могу открыть файл ', name ,
writeln ('Нажмите Enter для выхода');
writeln ('Первая строка файла:');
writeln ('Нажмите Enter для выхода');
В дальнейшем мы для краткости не всегда будем выполнять эти проверки, но хороший стиль программирования предполагает, что в своих программах вы будете их делать.
При чтении из файлов зачастую объем читаемых данных неизвестен заранее. Поэтому необходима функция, умеющая определять, прочитаны ли уже все данные:
function Eof(var F : text) : boolean;
-- возвращает true , если при чтении достигнут конец файла.
function Eoln (var F : text) : boolean;
-- возвращает true , если при чтении достигнут конец строки.
Как правило, основной цикл чтения файла с заранее неизвестным количеством строк выглядит так:
while not eof (f) do begin
и работы с ними>
При чтении из одного файла "смешанных" строковых и числовых данных следует проверять, действительно ли в нужных строках файла содержатся числа. Для этого можно использовать стандартную процедуру val . Как правило, формат файлов, понимаемых той или иной программой, выбирается программистом, и важно предусмотреть реакцию программы на ошибочный формат исходных данных. Допустим, наша программа представляет собой простейший телефонный справочник, включающий имена абонентов и по одному телефонному номеру на каждое имя. Формат файла, хранящего данные справочника, также выберем простейшим:
и т. д., то есть, в строках 1, 3, 5, . файла содержатся фамилии абонентов, а в строках 2, 4, 6, . -- их номера телефонов. Примем также, что файл справочника называется phones . txt , существует и находится в той же папке, откуда запускается программа. Полный листинг программы приводится ниже.
name , phone , search : string ;
writeln (Фамилия абонента для поиска:');
while not eof(f) do begin
readln ( f , name );
readln ( f , phone );
val ( phone , number , error );
номер-строку преобразовать в число>
if error<>0 then begin < если это
не удалось сделать - ошибка>
writeln ('Ошибка - нет номера телефона!',
' Номер строки=', strings );
writeln ('Нажмите Enter для выхода');
reset (input); readln; halt;
if name=search then begin
writeln ('Телефон найден:',number);
if found=false then
writeln ('Телефон не найден!');
writeln ('Нажмите Enter для выхода');
reset ( input ); readln ;
Этой учебной программе недостает как умения редактировать открываемый ей справочник, так и гибкости при поиске -- например, она различает как разные символы строчные и прописные буквы во вводимой фамилии.
21.2. Примеры работы с файлами
Рассмотрим несколько типовых задач на обработку текстовых файлов.
1. Чтение числовых данных из файла. Массив данных имеет фиксированную размерность, примем ее равной 5.
a: array [1..5] of integer; i:integer;
for i:=1 to 5 do read (f, a[i]);
assign (w, 'result.dat');
writeln (w,' Результаты :');
Файл с именем data.txt может быть, например, таким:
Файл результатов result.dat будет таким:
2. Просмотр любого текстового файла на экране. По заполнении экрана до 24 строк программа делает паузу.
var f:text; s:string; count:integer;
write ('Имя файла или 0 для выхода: ');
if s='0' then halt;
if IoResult<>0 then begin
writeln ('Не могу открыть файл ',s);
write ('Нажмите Enter для продолжения');
while not eof(f) do begin
if count=24 then begin
write ('Нажмите Enter для продолжения');
write ('Нажмите Enter для нового ввода');
Строка s здесь используется как для ввода имени файла, так и для чтения строки файла -- ведь после выполнения связывания оператором assign имя файла нам больше не нужно. Обратите внимание также на оператор continue , в данном случае он позволяет не завершать выполнение программы после неверного ввода пользователя.
3. Работаем со "смешанным" файлом данных, строки которого содержат значения разных типов.
Пусть файл data . txt имеет следующий вид:
В каждой строке файла находится фамилия рабочего и через пробел -- номер участка, на котором он работает.
Напишем программу для вывода фамилий всех работников выбранного участка и подсчета их количества.
я хочу сделать dll, что, используя tform в качестве параметра, простой план состоит в том, что если эта форма передала dll массив возврата файла dll, содержащий имя компонента. можно ли передать tform в качестве параметра?
Вот полный образец:
Сохраните его как Sample.java
скомпилируйте его с помощью: javac Sample.java
запустите его с помощью: java Sample "in.txt" "out.txt"
или: java Sample
Я не уверен, что вы хотите сделать с этим методом, но я надеюсь, что это может вам немного помочь. Если вам нужны входные данные во время выполнения, используйте класс Scanner . Руководство по его использованию здесь
Кроме того, если вы хотите получить вывод в своем классе, вы должны использовать "return", а не иметь его в качестве параметра.
Обратите внимание, что вы еще не назвали свой класс или не указали тип вывода.
Как это могло выглядеть:
Похожие вопросы:
Я хочу передать содержимое текстового файла в url. Поэтому я использую функцию fgets, чтобы прочитать содержимое файла строка за строкой и сохранить его в строке, а затем передать его в url, о.
В тестовом классе для основного метода параметру присваивается имя файла (этот файл содержит целочисленные данные) Вот фрагмент кода: static Main main = new Main(); static < String[] args =.
В PHP, если метод foo() вызывает метод bar ($name), может ли он передать свое имя метода (т. е. 'foo') в качестве параметра?
я хочу сделать dll, что, используя tform в качестве параметра, простой план состоит в том, что если эта форма передала dll массив возврата файла dll, содержащий имя компонента. можно ли передать.
Я пытаюсь загрузить файл с node.js. На мой взгляд, у меня есть кнопка : doctype 5 html(ng-app=lineApp) head title= title link(rel='stylesheet', href='/stylesheets/style.css') body p filename.
В PostgreSQL 9.1 мне нужно передать имя таблицы в качестве параметра моей функции, которая будет использоваться в курсоре, а затем вызвать эту функцию следующим образом: select myfunction('tableA');.
Я хочу передать имя таблицы в качестве параметра и изменить размер всех столбцов этой таблицы на длину столбца + 50. alter PROCEDURE dbo.testsp @tablename varchar(100) AS BEGIN DECLARE @totalWeight.
Как передать имя столбца в качестве параметра предложения where. SELECT RP.Saturday, RP.Sunday, RP.Monday, RP.Tuesday, RP.Wednesday, RP.Thursday, RP.Friday, RP.SalesMan, MC.CustomerID.
У меня есть хранимая процедура в Informix, которая использует внешние таблицы для выгрузки данных в дисковый файл из инструкции select. Можно ли указать имя файла DISK в качестве параметра хранимой.
Как я уже видел, люди предлагали использовать dynamic SQL. Например: Как передать схему в качестве параметра хранимой процедуре в sql server? Как передать имя схемы в качестве параметра в хранимой.
В Windows, как вы получаете доступ к аргументам, передаваемым при запуске командного файла?
Например, допустим, у меня есть программа с именем hello.bat . Когда я вхожу hello -a в командную строку Windows, как я могу сообщить своей программе, что она -a была передана в качестве аргумента?
Как и другие уже говорил, параметры , передаваемые через командную строку можно получить в пакетных файлах с пометкой %1 в %9 . Есть также два других токена, которые вы можете использовать:
- %0 это исполняемый файл (пакетный файл) имя , как указано в командной строке .
- %* это все параметры, указанные в командной строке - это очень полезно, если вы хотите переслать параметры в другую программу.
Есть также много важных методов, о которых нужно знать в дополнение к простому способу доступа к параметрам.
Проверка, был ли передан параметр
Это делается с помощью конструкций like IF "%
1"=="" , что верно, если и только если никакие аргументы не были переданы вообще. Обратите внимание на символ тильды, который приводит к удалению любых окружающих кавычек из значения %1 ; без тильды вы получите неожиданные результаты, если это значение включает двойные кавычки, включая возможность синтаксических ошибок.
Обработка более 9 аргументов (или просто облегчение жизни)
Если вам нужно получить доступ более чем к 9 аргументам, вы должны использовать команду SHIFT . Эта команда сдвигает значения всех аргументов на одно место, так что %0 принимает значение %1 , %1 принимает значение %2 и т. Д. %9 Принимает значение десятого аргумента (если он есть), который не был доступен ни для одной переменной перед вызовом SHIFT (введите команда SHIFT /? для дополнительных параметров).
SHIFT также полезно, когда вы хотите легко обработать параметры, не требуя, чтобы они были представлены в определенном порядке. Например, скрипт может распознавать флаги -a и -b в любом порядке. Хороший способ разбора командной строки в таких случаях
Эта схема позволяет вам анализировать довольно сложные командные строки, не сходя с ума.
Подстановка параметров партии
Для параметров, представляющих имена файлов, оболочка предоставляет множество функций, связанных с работой с файлами, которые недоступны никаким другим способом. Эта функциональность доступна с конструкциями, которые начинаются с %
Например, чтобы получить размер файла, переданного в качестве аргумента, используйте
Чтобы получить путь к каталогу, из которого был запущен командный файл (очень полезно!), Вы можете использовать
Вы можете просмотреть весь спектр этих возможностей, введя CALL /? в командной строке.
На этом уроке мы рассмотрим, что такое аргументы командной строки в языке C++ и то, как они используются.
Аргументы командной строки
Из урока №3 мы уже знаем, что при компиляции и линкинге, компилятор создает исполняемый файл. Когда программа запускается, выполнение начинается с первой строки функции main(). До этого урока мы объявляли main() следующим образом:
Обратите внимание, в этой версии функции main() никаких параметров нет. Тем не менее, многие программы нуждаются в некоторых входных данных. Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция picture() узнает, какое изображение нужно принять и обработать? Пользователь должен сообщить программе, какой файл следует открыть. Это можно сделать следующим образом:
std :: cout << "Enter name of image-file to create a thumbnail for: " ;Тем не менее, здесь есть потенциальная проблема. Каждый раз при запуске программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.
Рассмотрим это детально. Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определенном каталоге. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, такой подход будет, мягко говоря, не очень эффективным! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз функцию picture() для каждого файла.
В обоих случаях нам нужно, чтобы внешняя программа передавала имя файла в качестве входных данных в нашу программу при её запуске, вместо того, чтобы функция picture() сама дожидалась, пока пользователь вручную введет имя файла.
Передача аргументов командной строки
Исполняемые программы могут запускаться в командной строке через вызов. Например, для запуска исполняемого файла MyProgram , который находится в корневом каталоге диска C в Windows, вам нужно ввести:
Чтобы передать аргументы командной строки в MyProgram , вам нужно будет их просто перечислить после имени исполняемого файла:
Теперь, при запуске MyProgram , SomeContent.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:
C:\>MyProgram SomeContent.txt SomeOtherContent.txt
Это также работает и с Linux (хотя структура каталогов будет отличаться от структуры каталогов в Windows).
Если вы запускаете свою программу из среды IDE, то ваша IDE должна предоставить способ ввода аргументов командной строки.
Для пользователей Visual Studio: Щелкните правой кнопкой мыши по нужному проекту в меню "Обозреватель решений" > "Свойства" :
Затем выберите "Свойства конфигурации" > "Отладка" . На правой панели будет строка "Аргументы команды" . Вы сможете здесь ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске:
Пользователям Code::Blocks: Выберите "Project" > "Set program`s arguments. " :
Использование аргументов командной строки
Теперь, когда вы знаете, как передавать аргументы командной строки в программу, следующим шагом будет доступ к ним из программы. Для этого используется уже другая форма функции main(), которая принимает два аргумента ( argc и argv ) следующим образом:
Читайте также: