Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » C++: Построчное чтение файла в Builder

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
У меня есть форма, на ней кнопка и поле TMemo, я пытаюсь сделать так, чтобы по нажатию кнопки, в поле TMemo читался файл, но построчно, чтобы имелась возможность обрабатывать строки.
В хелпе ниче об этом не написано, исходников нет
Подскажите пожалуйста, как этот механизм реализовать средствами Borland C++ Builder 6.0, заранее благодарен.

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 21:21 22-03-2004
BoriSkin



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Посмотри хелпы функций OpenFile ReadFile и типа того

Всего записей: 97 | Зарегистр. 13-03-2004 | Отправлено: 15:54 23-03-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот блин молодежь обленилась - файл построчно считать уже проблема
вот тебе мелкий класс - юзать можно в любом C++

Код:
 
#include <stdio.h>
 
class str_read
{
public:
   str_read(FILE *fp_in)
   {
     fp = fp_in;
     alloced = 0;
     ptr = NULL;
   }
  ~str_read()
   {
     if ( ptr )
      free(ptr);
   }
   char *read_string(int &size);
protected:
    int alloced;
    char *ptr;
    FILE *fp;
}
 
char str_read::read_string(int &size)
{
   if ( !alloced )
  {
    alloced = 20;
    ptr = (char *)malloc(alloced);
  }
  char c;
  size = 0;
  while( !feof(fp) )
  {
    c = fgetc(fp);
    if ( feof(fp) )
     break;
    if ( !c )
     break;
    if ( c == 0xa )
     break;
    if ( c == 0xd )
    {
      if ( feof(fp) )
       break;
      c = fgetc(fp);
      if ( c == 0xa )
       break;
      else
       ungetc(c, fp);
    }
    /* add this symbol */
    if ( size >= alloced )
     ptr = (char *)realloc(ptr, alloced *= 2);
    ptr[size++] = c;
  }
  /* we need to add last zero symbol */
  if ( size >= alloced )
   ptr = (char *)realloc(ptr, alloced + 1);
  ptr[size] = 0;
  return ptr;  
}
 

соотв-но вызывая read_string пока не конец файла получаешь строку без символов перевода строки (и ей пополам какой это текст - DOS или UNIX)

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 15:56 23-03-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В хелпе ниче об этом не написано, исходников нет  

Похоже - недокументированная возможность Windows

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 00:16 24-03-2004
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp
Ну если учесть, что это С++:

Код:
 
#include <fstream>
using namespace std;
 
const int BUFSIZE = 512;
 
void fill(const char* filename)
{
  ifstream ifile(filename);
  if (!ifile.good()) return; // Ошибка открытия
 
  while (!ifile.eof())
  {
    char buf[BUFSIZE];
    ifile.getline(buf, sizeof(buf)-1);
    buf[BUFSIZE-1] = '\0';
    // Дальше - заноси строку куда надо.
  }
 
 

 
Добавлено
redp
Ну если учесть, что это С++:

Код:
 
#include <fstream>
using namespace std;
 
const int BUFSIZE = 512;
 
void fill(const char* filename)
{
  ifstream ifile(filename);
  if (!ifile.good()) return; // Ошибка открытия
 
  while (!ifile.eof())
  {
    char buf[BUFSIZE];
    ifile.getline(buf, sizeof(buf)-1);
    buf[BUFSIZE-1] = '\0';
    // Дальше - заноси строку куда надо.
  }
 
 

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 07:19 24-03-2004
Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а можно вот так?

Код:
 
 int s;
 int i;
 TStrings * slist =new TStringList;
 if (OpenDialog1->Execute()) slist->LoadFromFile(OpenDialog1->FileName);
 s = slist->Count;
 for(int i; i < s; i++ ) {
  //
  slist->Strings[i]; // <-  
  //
  }
 

а вот еще вопрос, а как разобрать строку?
 
Добавлено
да и со стандартными VCL классами потом работать проще...

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 20:35 24-03-2004
Peroon_N



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Arion
Хех... и винды тогда толком небыло когда это делали....
 
Добавлено
Ternik
Mickey_from_nsk более дельный совет дал...
 

Цитата:
а вот еще вопрос, а как разобрать строку?  

 
что значит разобрать?
если строка точно заточена, тоесть ты изначально знаеш ее формат то тебе поможет чтото типа этого:

Код:
sscanf(temp[loop],"%s %d %ld", &name, &age, &salary);

только незабудь подинклудить stdio.h...
работает с char - масивом...

Всего записей: 281 | Зарегистр. 26-03-2003 | Отправлено: 22:12 29-03-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Mickey_from_nsk
у тебя размер строки ограничен 511 байтами. А если тово - длиннее ?
кроме того getline некорректно обрабатывает текстовые файлы от UNIX
 
2Ternik
мало инфы как ты хочешь строку разобрать
возможно будет достаточно простого sscanf
возможно тебе помогут regular expressions вроде PCRE (http://www.pcre.org/)
либо lex/bizon

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 10:36 30-03-2004
Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp
да... это простой лог-файл, из которого нужно подсчитать траффик...
разделяется ", " но почему то если я использу strtok, то короче очень печально все это заканчивается при наличии пробела.
А объясните тогда как прочитать строку через sscanf, пытался, ниче не получилось млин
 

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 21:39 30-03-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Ternik
с ф-цией strtok есть две такие фишки
1) она портит строку, которую ты ей передаешь - вместо delimiterа кладет 0
2) чтобы получить следующий токен - ты должен отдать ей NULL, а не исходную строку. И так пока strtok не вернет тебе NULL
самый простой выход - использовать strtok с delimiter ",", а пробелы в начале и в конце строки вычищать самому

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 11:49 31-03-2004
Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp
хм... скажи пожалуйста, как сделать это, как убрать пробел в начале строки?

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 20:53 31-03-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Ternik
ну шо как маленький то
вот примерно так:

Код:
 
#include <ctype.h>
 
char *del_lead_spaces(char *ptr)
{
  while( *ptr && isspace(*ptr) )
   ptr++;
  return ptr;
}
 

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 11:18 01-04-2004
BoriSkin



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
за классы спасибо мужики иногда так вломак что-то делать у сами знаете, а тут подключил и кайфуешь

Всего записей: 97 | Зарегистр. 13-03-2004 | Отправлено: 12:28 01-04-2004
Yuliasha

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ! подскажите как считывать из файла построчно в юниксе в консольке?
В двух файлах в каждой строке записано по одному целому числу, нужно просуммировать числа из первого и второго файлов, рассположенных в строках с одинаковым номером.
помогите пожалуйста, весь моск себе уже съела
 

Всего записей: 1 | Зарегистр. 25-05-2009 | Отправлено: 21:39 25-05-2009
alekc2008



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
#include <ctype.h>  
 
char *del_lead_spaces(char *ptr)  
{  
  while( *ptr && isspace(*ptr) )  
   ptr++;  
  return ptr;  
}  
 

Всего записей: 236 | Зарегистр. 14-05-2007 | Отправлено: 19:40 15-04-2010
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » C++: Построчное чтение файла в Builder


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru