Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ чтение текстового файла

Автор: doorway 21.09.2010 1:46

есть текстовый файл:

Код
1 2
3


как эти цифры присвоить переменным a, b, c. что-то у меня не получается, напишите, пожалуйста, кому не лень только блок с read

Автор: volvo 21.09.2010 1:56

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



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

Автор: doorway 21.09.2010 2:10

Цитата(volvo @ 20.09.2010 22:56) *

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



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


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

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

вот их не получается считать таким способом

Автор: Unconnected 21.09.2010 2:12

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

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

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

Автор: sheka 21.09.2010 2:22

проблема в том, что в таком случае надо точно знать какое количество символов отводится на <string>. Т.е:

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

Автор: doorway 21.09.2010 2:25

Цитата(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 21.09.2010 2:37

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

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

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

Автор: doorway 21.09.2010 2:49

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

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

Автор: Unconnected 21.09.2010 2:55

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

Автор: doorway 21.09.2010 4:17

Цитата(Unconnected @ 20.09.2010 23:55) *

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


впринципе можно. а как получится, год же должен быть интегер

Автор: Lapp 21.09.2010 5:48

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

Автор: doorway 22.09.2010 1:46

Цитата(Lapp @ 21.09.2010 2:48) *

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


процедуры нельзя в программе использовать

Автор: sheka 22.09.2010 2:47

Если я не ошибаюсь, read - тоже процедура.

Автор: doorway 22.09.2010 2:59

Цитата(sheka @ 21.09.2010 22:46) *

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



в read после : говорит, что нужна ), почему?

Автор: Lapp 22.09.2010 5:12

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

Автор: doorway 22.09.2010 20:07

Цитата(Lapp @ 22.09.2010 2:12) *

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

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

Автор: volvo 22.09.2010 20:57

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

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

И об этом я тоже написал. Повторять как-то не особо хочется. Ибо не факт, что ты соизволишь прочесть со второй попытки.

Автор: sheka 23.09.2010 2:35

Виноват. Забыл. Хотел написать следующее:

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

Автор: volvo 23.09.2010 2:41

Ответ неверный smile.gif В C будет совсем не то, что ты ожидаешь smile.gif

Автор: sheka 23.09.2010 3:11

Дык я не обращал внимание на это, ведь о строке думал :yes:
Согласен, там будет пробел, верно?

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


Автор: Lapp 23.09.2010 3:16

Цитата(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 23.09.2010 3:24

Уже не могу)
если смотреть на структуру

Цитата
фамилию год пол
, то должно работать. Разве что на Реадлн заменить.


Автор: Lapp 23.09.2010 3:37

перечитай пост №7

Автор: Lapp 23.09.2010 9:32

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

p.s.
рад случаю добавить тебе в репу +1 ))