Помощь - Поиск - Пользователи - Календарь
Полная версия: чтение текстового файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
doorway
есть текстовый файл:
Код
1 2
3


как эти цифры присвоить переменным a, b, c. что-то у меня не получается, напишите, пожалуйста, кому не лень только блок с read
volvo
var a, b, c: integer;
// ...
read(f, a, b, c);



Я надеюсь, уроки из прошлой темы извлечены, и теперь признаки конца строки соответствующие в файле? smile.gif
doorway
Цитата(volvo @ 20.09.2010 22:56) *

var a, b, c: integer;
// ...
read(f, a, b, c);



Я надеюсь, уроки из прошлой темы извлечены, и теперь признаки конца строки соответствующие в файле? smile.gif


ага, понял все, вот просто у меня есть текстовый файл, там данные типа

Код
<string> <integer> <char>
(типы разделены пробелами),

вот их не получается считать таким способом
Unconnected
Ну так любую цифру (1 2 3 твои) можно считать как в string, так и в integer, и в char...

Ну если там перенос после 2, то наверное надо:

readln(f, a, b);
read(f, c);
sheka
проблема в том, что в таком случае надо точно знать какое количество символов отводится на <string>. Т.е:
var a:string; b: integer; c: char; k: byte;
// ...
read(f, a: k, b, c);
doorway
Цитата(Unconnected @ 20.09.2010 23:12) *

Ну так любую цифру (1 2 3 твои) можно считать как в string, так и в integer, и в char...

Ну если там перенос после 2, то наверное надо:

readln(f, a, b);
read(f, c);


получается так:
файл такой:
Код
aaa 1
2


код
a:string;
b,c: integer;
...
readln(f, a, b);
read©;
write(a,'--',b,'--',c);


выводит aaa 1--2--0

т.е., если первая переменная(a) при чтении файла имеет тип стринг, то данные с файла в переменную будут читаться не до пробела, а до конца строки. провел ни один эксперимент уже

Добавлено через 10 мин.
Цитата(sheka @ 20.09.2010 23:22) *

проблема в том, что в таком случае надо точно знать какое количество символов отводится на <string>. Т.е:
var a:string; b: integer; c: char; k: byte;
// ...
read(f, a: k, b, c);

volvo
Цитата
т.е., если первая переменная(a) при чтении файла имеет тип стринг, то данные с файла в переменную будут читаться не до пробела, а до конца строки.
Разумеется. Потому что строка из файла читается
1) либо до тех пор, пока выделенное под нее место не будет заполнено полностью
2) либо пока не встретится #13(символ конца строки). Всё, больше ничего. Пробел концом строки не является.

Вообще-то это один из первых советов при работе с текстовыми файлами: не использовать смешанные списки ввода. Нужно читать в строку до пробела - читай посимвольно (Char-ом) и соединяй символы в строку.

Цитата
проблема в том, что в таком случае надо точно знать какое количество символов отводится на <string>
Проблема - в том, что при ЧТЕНИИ нельзя указывать ширину поля, только при ЗАПИСИ это возможно.
doorway
есть файл из 10 строк, где записаны в строке
фамилию год пол

так вот эти данные надо считать и сравнить людей по годам, я собирался считать циклом каждую часть строки в двумерный массив. в один стринговый массив фамилию, в другой целый год, и в чарный пол. вот загвоздка на том, что первая идет фамилия стринговый тип и считывает всю строку.
Unconnected
Читай по строке в string, а потом эту строку разбивай на фамилию, год и пол, с помощью функций copy и pos.
doorway
Цитата(Unconnected @ 20.09.2010 23:55) *

Читай по строке в string, а потом эту строку разбивай на фамилию, год и пол, с помощью функций copy и pos.


впринципе можно. а как получится, год же должен быть интегер
Lapp
Цитата(doorway @ 21.09.2010 1:17) *
как получится, год же должен быть интегер
Используй процедуру Val
doorway
Цитата(Lapp @ 21.09.2010 2:48) *

Используй процедуру Val


процедуры нельзя в программе использовать
sheka
Если я не ошибаюсь, read - тоже процедура.
doorway
Цитата(sheka @ 21.09.2010 22:46) *

var a:string; b: integer; c: char; k: byte;
// ...
read(f, a: k, b, c);



в read после : говорит, что нужна ), почему?
Lapp
Цитата(doorway @ 21.09.2010 23:59) *
в read после : говорит, что нужна ), почему?
Может, не после, а вместо?
Потому что в Паскале нет форматного read (как тебе уже говорил volvo). Строка читается до конца.
Сообщение, я согласен, не очень точное - там может быть и запятая..
doorway
Цитата(Lapp @ 22.09.2010 2:12) *

Может, не после, а вместо?
Потому что в Паскале нет форматного read (как тебе уже говорил volvo). Строка читается до конца.
Сообщение, я согласен, не очень точное - там может быть и запятая..

а если надо считать строку только первые 15 символов?
volvo
doorway, ответы надо не просматривать, а читать. Внимательно читать.

Цитата
а если надо считать строку только первые 15 символов?

И об этом я тоже написал. Повторять как-то не особо хочется. Ибо не факт, что ты соизволишь прочесть со второй попытки.
sheka
Виноват. Забыл. Хотел написать следующее:
var a:string[15]; b: integer; c: char; k: byte;
// ...
read(f, a, b, c);
volvo
Ответ неверный smile.gif В C будет совсем не то, что ты ожидаешь smile.gif
sheka
Дык я не обращал внимание на это, ведь о строке думал :yes:
Согласен, там будет пробел, верно?
var a:string[15]; b: integer; c: char; k: byte;
// ...
read(f, a, b, c, с);

Lapp
Цитата(sheka @ 23.09.2010 0:11) *
Дык я не обращал внимание на это, ведь о строке думал :yes:
Согласен, там будет пробел, верно?
var a:string[15]; b: integer; c: char; k: byte;
// ...
read(f, a, b, c, с);

А ты попробуй smile.gif
sheka
Уже не могу)
если смотреть на структуру
Цитата
фамилию год пол
, то должно работать. Разве что на Реадлн заменить.

Lapp
перечитай пост №7
Lapp
sheka, извини, очередное ВПР, временное помутнение рассудка ((.
Все верно. При условии, что "фамилию" занимает ровно 15 байт.
Но чтение всей строки с последующим разбором все же предпочтительнее со многих точек зрения.

p.s.
рад случаю добавить тебе в репу +1 ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.