Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2020, 03:06   #11
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
Все это очень хитро звучит. Меня интересует просто считать записанные в несколько колонок в текстовый файл данные, количество колонок и тип данных в них заранее известны
Используйте свой код из #4 и не бойтесь ничего. Код абсолютно грамотный! Если файл текстовый и состоит из "колонок" разделенных пробелами.
northener вне форума Ответить с цитированием
Старый 26.01.2020, 07:53   #12
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Зачем? Не верите Паскалевскому/Дельфийскому компилятору?
Ввод данных выполняется через буфер - специальную область оперативной памяти. Фактически данные сначала заносятся в буфер, а затем считываются оттуда процедурами ввода. Занесение в буфер выполняется по нажатию клавиши Enter вместе с ее кодом (#13#10). Процедура read, в отличие от readln, не очищает буфер, поэтому следующий после нее ввод будет выполняться с того места, на котором закончился предыдущий, то есть начиная с символа конца строки:
Код:
read(a); { считывается целое }
write(' Продолжить? (y/n) ');
readln(d); { вместо ожидания ввода символа считывается символ #13 из предыдущего
ввода }
Чтобы избежать подобной ситуации, следует вместо read использовать readln.
© Паскаль. Программирование на языке высокого уровня: Учебник для вузов.
Павловская Т. А. 2007
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 26.01.2020 в 08:36.
Desc вне форума Ответить с цитированием
Старый 26.01.2020, 12:11   #13
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Используйте свой код из #4 и не бойтесь ничего. Код абсолютно грамотный! Если файл текстовый и состоит из "колонок" разделенных пробелами.
Только есть в нем одна потенциальная проблема - возможно, тут мне кто-то подскажет, как лучше с ней бороться. Я с ней сталкивался также в С++, хотя и с некоторыми отличиями - там считывание из файла можно сделать совершенно аналогично.

Код:
Assign(F, 'test.dat');
ReWrite(F);

for i:=1 to 5 do begin
i1:=Factorial(i);
Writeln(F, i, '   ', i1);
end;
Writeln(F,'');
Writeln(F,'');
Writeln(F,'');

Reset(F);

while not Eof(F) do
begin
 Readln(F, i1, i2);
 Writeln(i1, '        ', i2);
end;

 CloseFile(F);
Вот, собственно, под рукой есть тестовая программка, забивающая в файл в одну колонку целое число, в другую факториал от него. После записи чисел добавляем несколько пустых строк. В результате у нас считывается на строчку больше, и в переменные при этом забиваются нули. Это происходит, если пустых строк в конце файла больше одной, с одной пустой строкой все в порядке.
Если написать полностью аналогичный код на С++, там при считывании тоже возникнет подобный эффект, но уже при наличии хотя бы одной пустой строки. Правда, в переменные попадут не нули, а продублируются числа из предыдущей "значащей" строки.

Последний раз редактировалось archerix; 26.01.2020 в 12:17.
archerix вне форума Ответить с цитированием
Старый 26.01.2020, 14:03   #14
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

А в чем собственно проблема?
northener вне форума Ответить с цитированием
Старый 26.01.2020, 17:33   #15
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Ну как? В том, что при считывании таким образом, если в конце файла присутствуют пустые строки, может появиться "паразитная" строка данных. В Дельфи она содержит нули, в С++ значения из последней значащей строки. Проверять потом данные - а вдруг там действительно такие числа должны были быть?

Возможно, перед считыванием в сами переменные можно поставить какую-то проверку на пустую строку?

Можно предварительно прокрутить один раз цикл, подсчитав непустые строки, работает. Но это как-то длинно, два цикла делать, хотелось бы за один раз. Можно ли, не углубляясь особо в парсинг, аналогично файлу "считать" значения переменных из строки? То есть считывать целой строкой, проверять, не пустая ли она, а потом раскидывать по переменным.

Последний раз редактировалось archerix; 26.01.2020 в 19:16.
archerix вне форума Ответить с цитированием
Старый 27.01.2020, 02:27   #16
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
Ну как? В том, что при считывании таким образом, если в конце файла присутствуют пустые строки, может появиться "паразитная" строка данных.
Давайте отделим мух от котлет. Если речь идет об обработке реальных физических данных чего-либо, то в первую очередь надо разобраться с причинами появления "пустых" строк в данном файле. И либо устранить эти причины, либо выработать алгоритм обработки недостоверных данных на основе этих причин.
Если же речь идет о сферическом коне в вакууме, то допустимы любые решения.
Цитата:
Сообщение от archerix Посмотреть сообщение
Можно ли, не углубляясь особо в парсинг, аналогично файлу "считать" значения переменных из строки? То есть считывать целой строкой, проверять, не пустая ли она, а потом раскидывать по переменным.
Можно.
northener вне форума Ответить с цитированием
Старый 27.01.2020, 02:30   #17
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Чтобы избежать подобной ситуации, следует вместо read использовать readln.
Вы не поняли о чём идёт речь.
northener вне форума Ответить с цитированием
Старый 27.01.2020, 02:47   #18
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
Это происходит, если пустых строк в конце файла больше одной, с одной пустой строкой все в порядке.
Если написать полностью аналогичный код на С++, там при считывании тоже возникнет подобный эффект, но уже при наличии хотя бы одной пустой строки.
Это из-за того, что С не всегда следует грамотному формированию "окончания" строки, а вы не совсем правильно понимаете что такое "пустая" строка.
northener вне форума Ответить с цитированием
Старый 27.01.2020, 04:00   #19
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Давайте отделим мух от котлет. Если речь идет об обработке реальных физических данных чего-либо, то в первую очередь надо разобраться с причинами появления "пустых" строк в данном файле. И либо устранить эти причины, либо выработать алгоритм обработки недостоверных данных на основе этих причин.
Мало ли какие причины. Если записывать как в примере, одна пустая строка уже появится. А может, кто-то открыл файл посмотреть и Enter нажал
Цитата:
Это из-за того, что С не всегда следует грамотному формированию "окончания" строки, а вы не совсем правильно понимаете что такое "пустая" строка.
Ну как что такое - строка, в которой нет ничего, кроме символа перехода строки?
archerix вне форума Ответить с цитированием
Старый 27.01.2020, 09:30   #20
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,792
По умолчанию

а попадётся вам файл, которые пересылали много раз, изменяли содержимое, сохраняли и пересохраняли. и в нём будут по ошибке записаны не нули, а скажем буквы О. он тоже распознает эти строки как нули? или вообще символ с кодом 0.
поэтому, надо в код по считыванию, где функции readln() и read(), включить проверки на всякие неудобные и неугодные символы....
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как считать файл без расширения. С++ Nikzz Помощь студентам 3 24.10.2017 20:23
Экспорт всех колонок из ListView в .csv файл (Microsoft Excel) FleXik Общие вопросы Delphi 18 12.07.2015 20:10
Как побайтово считать файл GIF? Bubel Visual C++ 1 29.10.2011 02:23
Как побайтово считать файл GIF? Bubel Visual C++ 1 27.10.2011 11:44
Считать wav-файл С++ Skido Помощь студентам 4 30.01.2009 03:06