Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

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

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

Цитата:
Сообщение от 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 в 09:36.
Desc вне форума Ответить с цитированием
Старый 26.01.2020, 13: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 в 13:17.
archerix вне форума Ответить с цитированием
Старый 26.01.2020, 15:03   #14
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,613
По умолчанию

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

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

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

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

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

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

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

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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как считать файл без расширения. С++ Nikzz Помощь студентам 3 24.10.2017 21:23
Экспорт всех колонок из ListView в .csv файл (Microsoft Excel) FleXik Общие вопросы Delphi 18 12.07.2015 21: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 04:06


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS