Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Работа с текстовым файлом, обработка строк

  1. #1

    По умолчанию Работа с текстовым файлом, обработка строк

    Здравствуйте!

    Пожалуйста, подскажите, как правильно можно работать с файлом (и с процессом в общем) в следующей ситуации, возможно можно пойти иным путем, но пока вижу так:
    При работе условного цикла пошагово проводится запись строковых параметров в текстовый файл, примерно так:
    Код:
    № t[ч:м:с] t[м:с] P[мбар] T[°C]
    3 ВАКУУМ 
      00:01:14 00:28 79 41.4
    4 ПОДАЧА 
      00:01:58 00:43 1151 103.7
    ...


    Процесс идет следующим образом:
    1. При возникновении условий происходит запись строки в файл - Выполняется SysFile.SysFileWrite
    2. В окне Текстовый редактор (режим чтения) открывается записанный файл для отображения шагов программы
    3. При добавлении записи в файл, для обновления строк в Текстовом редакторе проводится закрытие и открытие файла и перевод курсора на конец файла

    По окончании процесса файл TXT становится файлом отчета, который в последующем можно прочитать и при желании провести распечатку.

    Каким образом после чтения файла текст можно разделить на строки для последующей раздельной обработки построчно (в частности будет производиться печать на POS принтере)?
    Возможно ли отобразить текст из файла в текстовом поле и обновлять его в ходе процесса?


    Спасибо,

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,171

    По умолчанию

    Добрый день.

    Каким образом после чтения файла текст можно разделить на строки для последующей раздельной обработки построчно
    Например - с помощью функции SplitStringByToken из библиотеки OwenStringUtils (или WSplitStringByToken, если вы используете WSTRING) - при условии, что у строк есть какой-то разделитель (например, символы переноса строк \r\n и т.п.).

    Возможно ли отобразить текст из файла в текстовом поле и обновлять его в ходе процесса?
    Возможно.

  3. #3

    По умолчанию

    Хм. Ну на VC++ я писал когда-то чтение из байтового потока данных (не из файла).
    Новые строки отслеживал по символам 0x10 и 0x13 (в си это "\r\n") - это символы CR, LF (возврат курсора на начало строки и создание новой строки). Эти символы могут встретиться оба, а могут по отдельности. Я записывал данные сам и всегда сам ставил их два.
    Вот мой кривой код времён 2003 года:
    Код:
    //Читает строку из потока IStream - до символов \r\n
    HRESULT ReadLineFromStream(IStream *pStm, CString *pLine)
    {
    	//algorithm: read by char to combination "\r\n" or to eof
    	ASSERT(pStm!=NULL);	//Check pointer
    
    	DWORD pw=1;	//initial value
    	CString tmpS,tmpBuf;
    	LPSTR buf;
    	HRESULT hr=S_OK;	//initial value
    
    	buf=new char[1];	//allocate bufer
    
    	//read symbols from stream
    	while ((hr==S_OK) && (pw))
    	{
    		hr=pStm->Read(buf,1,&pw);	//get n-char line
    		tmpBuf=buf;
    		tmpBuf=tmpBuf.Left(pw);	//get a physical n-char string
    
    		tmpS+=tmpBuf;
    		
    		//check new line symbols
    		if(strcmp(tmpS.Right(2),_T("\r\n"))==0)
    		{
    			tmpS=tmpS.Left(tmpS.GetLength()-2);
    			hr=S_FALSE;	//read complete
    		}
    	}
    	*pLine=tmpS; //return result
    	delete buf;		//delete buffer
    	return true;
    }
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  4. #4

    По умолчанию

    Евгений Кислов, Cs-Cs

    Спасибо,

    Как я понимаю, при считывании текста из файла, мы берем его из буфера и обрабатываем уже, как считаем нужным.
    При формировании и записи файла, перенос строк проводился посредствам $N, но уже в сформированном файле как таковых символов \r\n нет, т.е., вероятно, нужно в конце каждой строки делать какой то разделитель

    Попробую разобраться, спасибо,

  5. #5

    По умолчанию

    Нет, не до конца так: как раз вот "$N" внутри файла превращается или в 0x0D, 0x0A или только в 0x0D или только в 0x0A (надо посмотреть сам файл).
    Просто в программе эти символы перевода строки не ввести так просто (они не печатные) и, чтобы не париться, разработчики сред разработки выдумывают их заполнители. У кого-то - $N, у кого-то \r\n, у кого-то только \n. В реальном файле будут переводы строк. И это тоже символы.
    Вот, показываю тестовый файл в двоичном виде и стрелками эти символы.
    TextFile.gif
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  6. #6

    По умолчанию

    Cs-Cs,

    Спасибо, все понял о чем идет речь
    Изображения Изображения
    • Тип файла: png 000.png (16.6 Кб, Просмотров: 11)

  7. #7

    По умолчанию

    Ага, вот (иногда мне самому сложно подобрать слова, чтобы пояснить).
    Эти самые 0x0A и будут нужными разделителями строк.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  8. #8

    По умолчанию

    Добрый день!

    В продолжении темы.

    1. Использование Текстового редактора:
    Логику отрабатывает хорошо), за исключением того, что не отображает кириллицу.
    Возможно ли исправить ситуацию, т.е. возможность отображения в Текстовом редакторе кириллицы?
    Сейчас строки в файл сохраняются как STRING, может быть все сохранять в WSTRING и тогда проблем быть не должно, но в последующем для вывода на принтер снова преобразовывать...
    А можно ли сохранить файл из WSTRING. Библиотека FileSys ругается и просит предварительно преобразовать в строку UTF-8, но при этом сохраняются кракозябры

    2. Также рассмотрел вариант отображения в текстовом поле, но столкнулся с ограничением STRING 255 символов и при переводе в WSTRING, наверное, также будут ограничения. А какое ограничение символов WSTRING?
    Но этот путь несколько неправильный, т.к. возможный текст может иметь много строк, которые не смогут вместиться в текстовое поле и придется придумывать стрелки вниз/вверх для перелистывания или сдвигания текста в поле, а это отдельный код. Т.е. смотрю в сторону Текстового редактора
    Последний раз редактировалось ShikuS; 12.12.2023 в 17:13.

  9. #9

    По умолчанию

    ...так может всё же вести текстовый лог отдельно, а на экране - отдельно?
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  10. #10

    По умолчанию

    Cs-Cs,

    Похоже, когда все идеи иссякнут, то что то придется придумывать, но хочется сделать универсальность, а не получается.
    ...так может всё же вести текстовый лог отдельно, а на экране - отдельно?
    Так сделать можно, если в онлайн будет, как я предполагаю: вывод в текстовое поле лога WSTRING, будет идет печать на POS и отдельно запись в файл.
    Другой вопрос, что WSTRING 255 символов. Даже есть где-то возможность преобразования в более длинные тексты, но с учетом многострочности, также придется продумывать некий код для перемотки вперед назад.
    Далее - файл - это история для хранения и возможности распечатки в дальнейшем, т.е. файл мне все равно нужно сохранять для последующего просмотра и печати и в таком случае мы возвращаемся к вопросу отображения, но вести текстовый лог уже не сможем, т.к. все данные нужно тянуть из файла.(или шаблон текста заводить отдельно и отдельно параметры)

    Сейчас имеем:
    При записи файла через библиотеку SYSFILE получаем кодировку UTF-8, при которой текст не отображается в нормальном виде при открытии файла ни в блоке Текстового редактора, ни при отображении в текстовом поле. Хотя вытягивал из файла текст 255 символов в текстовое поле, переводил через CP1251_TO_UNICODE в WSTRING и было все хорошо. но только 255 символов

    Т.е. технически сохранять в файл UTF-8 кириллицу и когда требуется, вытягивать, условно +-2000 символов, преобразовывать в WSTRING, отображать и печатать...как костыль - можно.
    С другой стороны POS принтер печатает кириллицу при этом хорошо, с UTF-16 пока пробовал 1 раз, не очень с наката получилось...вернее пока не получилось).

    Текстовый редактор может сохранять файлы с UTF-16, проверено. Может быть попробовать создавать файл из Текстового редактора и дозаписывать его вставкой текста, однако не вижу переменной/или функции вставки текста в редактор или через буфер...как то все усложняется..думаю есть способ легче, найти бы его)

    Может быть @Евгений Кислов или кто о еще имел опыт с подобным
    Последний раз редактировалось ShikuS; 12.12.2023 в 18:47.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Что с файлом?
    от Lihoj в разделе Среда программирования OWEN Logic
    Ответов: 4
    Последнее сообщение: 28.11.2021, 15:48
  2. Списки строк
    от evg3798 в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 14.09.2015, 16:47
  3. Ответов: 4
    Последнее сообщение: 08.07.2014, 22:54
  4. Ответов: 5
    Последнее сообщение: 19.12.2007, 08:31
  5. проблема с лог-файлом
    от Змий в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 22.08.2007, 14:13

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •