Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 8:

Буферизированный (потоковый) ввод-вывод. Часть III

8.2.3. Ввод-вывод средствами языка Basic

Для операций файлового ввода-вывода используются операторы, описание которых представлено в Приложении №III (п. 8.6 данной лекции).

Примеры функций на языке Quick Basic, реализующие форматированный вывод строки в файл и чтение её из файла, приведены ниже:

Пример 8.7.

REM ФАЙЛ EX08007.BAS
REM ЗАПИСЬ ЗНАЧЕНИЯ В ТЕКСТОВЫЙ ФАЙЛ
REM
REM ДАННЫЙ ПРИМЕР ТЕСТИРОВАЛСЯ В СИСТЕМЕ ПРОГРАММИРОВАНИЯ
REM QUICK BASIC MICROSOFT WINDOWS 98
REM
REM ИНИЦИАЛИЗАЦИЯ
ICSIZE% = 5
REM ОТКРЫВАЕМ ТЕКСТОВЫЙ ФАЙЛ
OPEN "tempfile.txt" FOR OUTPUT AS #1
REM ВВОД С КОНСОЛИ ТЕКСТОВОЙ СТРОКИ
PRINT "Введите строку из "; ICSIZE%; " символов :";
INPUT INITSTR$
REM ПРОВЕРКА ДЛИНЫ ВВЕДЁННОЙ СТРОКИ
INITSTR% = LEN(INITSTR$)
IF INITSTR% <= ICSIZE% THEN
	RESSTR$ = INITSTR$
ELSE
	RESSTR$ = LEFT$(INITSTR$, ICSIZE%)
END IF
REM ВЫВОД ВВЕДЁННОЙ СТРОКИ ТЕКСТА
PRINT #1, RESSTR$
REM ЗАКРЫТИЕ ФАЙЛА И ЗАВЕРШЕНИЕ РАБОТЫ
CLOSE #1
INPUT "Press key Enter to Exit...", JUNK
STOP
END

Пример 8.8.

REM ФАЙЛ EX08008.BAS
REM ЧТЕНИЕ ЗНАЧЕНИЯ ИЗ ТЕКСТОВОГО ФАЙЛА
REM
REM ДАННЫЙ ПРИМЕР ТЕСТИРОВАЛСЯ В СИСТЕМЕ ПРОГРАММИРОВАНИЯ
REM QUICK BASIC MICROSOFT WINDOWS 98
REM
REM ИНИЦИАЛИЗАЦИЯ
ICSIZE% = 5
REM ОТКРЫВАЕМ ТЕКСТОВЫЙ ФАЙЛ
OPEN "tempfile.txt" FOR INPUT AS #1
REM ЧТЕНИЕ СТРОКИ ИЗ ФАЙЛА
LINE INPUT #1, INITSTR$
REM ПРОВЕРКА ДЛИНЫ ВВЕДЁННОЙ СТРОКИ
INITSTR% = LEN(INITSTR$)
IF INITSTR% <= ICSIZE% THEN
	RESSTR$ = INITSTR$
ELSE
	RESSTR$ = LEFT$(INITSTR$, ICSIZE%)
END IF
REM ВЫВОД СТРОКИ ТЕКСТА
PRINT "Значение строки в файле: ";
PRINT RESSTR$
REM ЗАКРЫТИЕ ФАЙЛА И ЗАВЕРШЕНИЕ РАБОТЫ
CLOSE #1
INPUT "Press key Enter to Exit...", JUNK
STOP
END

8.2.4. Ввод-вывод средствами языков Perl и Python

Функции файлового ввода-вывода на языке Perl описаны в пункте 6.2.4 "Буферизированный (потоковый) ввод-вывод" и 7.1.4 "Буферизированный (потоковый) ввод-вывод. Часть II" данного курса. Описание функций открытия и закрытия дескрипторов файлов в Perl приведены в приложении №4 (пункт 8.7. данной лекции). Здесь же автор приводит примеры файлового ввода-вывода на языке Perl:

Пример 8.9

#!perl -w
# File ex08009.pl
# Данная функция вводит с клавиатуры строку длиной
# не более 5 символов и записывает эту строку
# в файл tempfile.txt в текущем каталоге
#
# Данный пример тестировался компилятором
# ActiveState Perl 5.8.0
#
# Инициализация:
$icsize = 5;
# Открытие файла и чтение строки
open( STREAM, ">", "tempfile.txt" );
print "\nВведите строку текста (не более $icsize символов): ";
$initstr = <STDIN>;
# Обрезание строки слева на $icsize символов
$str = substr $initstr, 0, $icsize;
# Вывод в файл и его закрытие
print STREAM $str;
close( STREAM );
# Завершение работы
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла

Пример 8.10

#!perl -w
# File ex08010.pl
# Данная функция вводит из файла tempfilе.txt в текущем каталоге
# строку длиной, обрезает её до длины не более 5 символов
# и выводит эту строку на экран
#
# Данный пример тестировался компилятором
# ActiveState Perl 5.8.0
#
# Инициализация:
$icsize = 5;
# Открытие файла и чтение строки
open( STREAM, "<", "TEMPFILE.TXT" );
# read( STREAM, $initstr, $icsize );
$initstr = <STREAM>;
# Обрезание строки слева на $icsize символов
$resstr = substr $initstr, 0, $icsize;
# Вывод в файл и его закрытие
print "\nСтрока, записанная в файл: $resstr";
close( STREAM );
# Завершение работы
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла

Функции файлового ввода-вывода на языке Python описаны в пункте 6.2.5 "Буферизированный (потоковый) ввод-вывод" и 7.1.5 "Буферизированный (потоковый) ввод-вывод. Часть II" данного курса. Описание функций открытия и закрытия дескрипторов файлов в Python приведены в приложении №5 (пункт 8.8. данной лекции). Здесь же автор приводит примеры файлового ввода-вывода на языке Python:

Пример 8.11

#! %PYTHON%/python
# -*- coding: cp866 -*-
# File ex08011.py
# Данная функция вводит с клавиатуры строку длиной
# не более 5 символов и записывает эту строку
# в файл tempfile.txt в текущем каталоге
#
# Данный пример тестировался компилятором
# ActiveState Python 2.5
#
def ex08011():
# Инициализация:
	icsize = 5
# Открытие файла и чтение строки
	stream = open( "tempfile.txt", "w" )
	print 'Введите строку длиной не более %2d символов: ' % icsize,
	initstr = raw_input()
# Обрезание прочтённой строки до icsize символов с начала
	resstr = initstr[0:icsize]
# Вывод получившейся строки в файл и закрытие потока
	stream.write( resstr )
	stream.close()
# Завершение работы
	junk = raw_input( 'Press key Enter to Exit...')
# Конец файла

Пример 8.12

#! %PYTHON%/python
# -*- coding: cp866 -*-
# File ex08012.py
# Данная функция вводит из файла tempfile.txt в текущем каталоге
# строку длиной, обрезает её до длины не более 5 символов
# и выводит эту строку на экран
#
# Данный пример тестировался компилятором
# ActiveState Python 2.5
#
def ex08012():
# Инициализация:
	icsize = 5
# Открытие файла и чтение строки
	stream = open( "tempfile.txt", "r" )
	initstr = stream.read( icsize )
# Обрезание прочтённой строки до icsize символов с начала
# (Здесь этот оператор лишний)
	resstr = initstr[0:icsize]
	stream.close()
# Вывоз строки из файла на экран
	print 'Строка, записанная в файл: ',
	print resstr
# Завершение работы
	junk = raw_input( 'Press key Enter to Exit...')
# Конец файла

8.2.5. Ввод-вывод средствами языка Turbo Prolog

Для ввода-вывода строк в тестовый файл средствами Turbo Prolog чаще всего используется file_str, однако встречаются и другие функции. Их описания смотри в приложении №6 (пункт 8.9. данной лекции).

Примеры реализации алгоритмов ввода-вывода в текстовые файлы на языке Prolog.

Пример 8.13.

/* Файл ex08013.pro */
/* Данный пример тестировался в системе программировани
   Turbo Prolog 2.0 */
domains
/* Описываем переменные */
	Icsize, Ilen = integer
	Initstr, Resstr = string
predicates
/* Определяем правила  */
	icsize( Icsize )
	trunk( Icsize,
	Initstr, ResStr )
clauses
/* Определяем правила  */
/* Инициализация переменных */
	icsize( Icsize ) :- Icsize = 5.
/* Предикат, обрезающий строку InitStr до IcSize, если это необходимо */
	trunk( Icsize, Initstr, Resstr ) :- str_len(  Initstr, Ilen ), Ilen < Icsize, Resstr = Initstr,!.
	trunk( Icsize, Initstr, Resstr ) :- str_len(  Initstr, Ilen ), Ilen >= Icsize, frontstr( Icsize, Initstr, Resstr, _ ),!.
goal
/* Вывод текста Приглашения */
	icsize(Icsize), writef( "\nВведите строку длиной не более %d символов: ", Icsize ),
/* Ввод строки */
	readln ( Initstr ),
/* Обрезание строки до 5 символов */
	trunk( Icsize, Initstr, Resstr ),
/* Вывод строки в файл */
	file_str("TEMPFILE.TXT", Resstr),
/* Вывод завершающей надписи */
	write( "Press key Enter to exit..." ), readchar( _ ).
/* Конец программы */

Пример 8.14.

/* Файл ex08014.pro */
/* Данный пример тестировался в системе программировани
   Turbo Prolog 2.0 */
domains
/* Описываем переменные */
	Icsize, Ilen = integer
	Initstr, Resstr = string
predicates
/* Определяем правила  */
	icsize( Icsize )
	trunk( Icsize, Initstr, ResStr )
clauses
/* Определяем правила  */
/* Инициализация переменных */
	icsize( Icsize ) :- Icsize = 5.
/* Предикат, обрезающий строку InitStr до IcSize, если это необходимо */
	trunk( Icsize, Initstr, Resstr ) :- str_len(  Initstr, Ilen ), Ilen < Icsize, Resstr = Initstr,!.
	trunk( Icsize, Initstr, Resstr ) :- str_len(  Initstr, Ilen ), Ilen >= Icsize, frontstr( Icsize, Initstr, Resstr, _ ),!.
goal
/* Ввод строки из файла */
	file_str("TEMPFILE.TXT", Initstr), icsize(Icsize),
/* Обрезание строки до 5 символов */
	trunk( Icsize, Initstr, Resstr ),
/* Вывод текста строки */
	writef( "\nСтрока, записанная в файл: %s.", Resstr ),
/* Вывод завершающей надписи */
	write( "Press key Enter to exit..." ), readchar( _ ).
/* Конец программы */

8.2.6. Ввод-вывод средствами языка Visual Basic Script

Для вывода строк в тестовый файл средствами Java чаще всего используется класс PrintWriter, а для чтения данных из текстового файла - файл BufferedReader. Их описания смотри в приложении №7 (пункт 8.10. данной лекции).

Примеры реализации алгоритмов ввода-вывода в текстовые файлы на языке Java

Пример 8.15.

/* File ex08015.java */
/* Функция реализует простейший пример ввода данных с клавиатуры и записи их в файл */
/* Данный пример требует наличие компилированного класса SavitchIn */
/* Данный пример тестировался в системе программировани
   Sun Java J2EE SDK версии 1.6 */
import java.io.*;
import java.util.*;
// Файл ex08015.java
public class ex08015
{
	public static void main( String[] args )
	{
/* Определение переменных */
		int icsize;
		String Initstr, Resstr, junk;
		PrintWriter outStream = null;
/* Начало диалога (ввод данных пользователя */
		System.out.print("Введите строку (не более 5 символов): ");
		Initstr = SavitchIn.readLine();
/* Проверка условия и вывод диалога */
		icsize = Initstr.length();
		if( icsize <=5 )
			Resstr = Initstr;
		else
			Resstr = Initstr.substring(0,5);
		try
		{
			outStream = new PrintWriter( new FileOutputStream( "TEMPFILE.TXT" ));
		}
		catch( FileNotFoundException e )
		{
			System.out.println( "Ошибка открытия файла: TEMPFILE.TxT" );
/* Завершение работы программы */
			System.out.println( "Press key Enter to exit..." );
			junk = SavitchIn.readLine();
			System.exit(0);
		}
		outStream.println( Resstr );
		outStream.close();
/* Завершение работы программы */
		System.out.println( "Press key Enter to exit..." );
		junk = SavitchIn.readLine();
	}
}
Листинг .

Пример 8.16.

/* File ex08016.java */
/* Функция реализует простейший пример ввода данных с клавиатуры и записи их в файл */
/* Данный пример требует наличие компилированного класса SavitchIn */
/* Данный пример тестировался в системе программировани
   Sun Java J2EE SDK версии 1.6 */
import java.io.*;
import java.util.*;
// Файл ex08016.java
public class ex08016
{
	public static void main( String[] args )
	{
/* Определение переменных */
		int icsize;
		String Initstr, Resstr, junk;
		BufferedReader inpStream = null;
		/* Открытие текстового файла */
		/* Ввод строки символов из файла */
		try
		{
			inpStream = new BufferedReader( new FileReader( "TEMPFILE.TXT" ));
			Initstr = inpStream.readLine();
	/* Проверка условия и вывод строки из файла */
			icsize = Initstr.length();
			if( icsize <=5 )
				Resstr = Initstr;
			else
				Resstr = Initstr.substring(0,5);
			System.out.print( "Введённая из файла строка: " );
			System.out.println( Resstr );
	/* Завершение работы программы */
			System.out.println( "Press key Enter to exit..." );
			junk = SavitchIn.readLine();
		}
		catch( FileNotFoundException e )
		{
			System.out.println( "Ошибка открытия файла: TEMPFILE.TXT; " );
			System.out.println( "Или файл не найден." );
/* Завершение работы программы */
			System.out.println( "Press key Enter to exit..." );
			junk = SavitchIn.readLine();
			System.exit(0);
		}
		catch( IOException e )
		{
			System.out.println( "Ошибка чтения данных из файла: TEMPFILE.TXT; " );
/* Завершение работы программы */
			System.out.println( "Press key Enter to exit..." );
			junk = SavitchIn.readLine();
			System.exit(0);
		}
	}
}
Листинг .

8.3. Резюме потокового вывода

Итак, вы прослушали заключительную часть лекции по потоковому выводу в файлы и ввода данных из файлов. Теперь Вы можете писать любые программы для консоли (с интерфейсом CLI, "Command Line Interface", по терминологии Linux), а именно фильтры, консольные просмотрщики файлов, утилиты командной строки, макросы и скрипты на языках оболочки ("Shell"). Более того, Вы сможете писать "почти настоящие программы" на языке командной оболочки Вашей операционной системы!

Однако Вы заметили, что в этом курсе "чего-то не хватает", а именно - ввод вывод с использованием API разных программ, и прежде всего - WinAPI. В следующих лекциях автор попытается исправить эти пробелы в курсе.

Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига