Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++: Построчное чтение файла в Builder

Автор: Ternik
Дата сообщения: 22.03.2004 20:21
Всем привет!
У меня есть форма, на ней кнопка и поле TMemo, я пытаюсь сделать так, чтобы по нажатию кнопки, в поле TMemo читался файл, но построчно, чтобы имелась возможность обрабатывать строки.
В хелпе ниче об этом не написано, исходников нет
Подскажите пожалуйста, как этот механизм реализовать средствами Borland C++ Builder 6.0, заранее благодарен.
Автор: BoriSkin
Дата сообщения: 23.03.2004 14:54
Посмотри хелпы функций OpenFile ReadFile и типа того
Автор: redp
Дата сообщения: 23.03.2004 14:56
вот блин молодежь обленилась - файл построчно считать уже проблема
вот тебе мелкий класс - юзать можно в любом 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;
}
Автор: Arion
Дата сообщения: 23.03.2004 23:16

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

Похоже - недокументированная возможность Windows
Автор: Mickey_from_nsk
Дата сообщения: 24.03.2004 06:19
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';
// Дальше - заноси строку куда надо.
}

Автор: Ternik
Дата сообщения: 24.03.2004 19:35
а можно вот так?

Код:
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]; // <-
//
}
Автор: Peroon_N
Дата сообщения: 29.03.2004 20:12
Arion
Хех... и винды тогда толком небыло когда это делали....

Добавлено
Ternik
Mickey_from_nsk более дельный совет дал...


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


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

Код: sscanf(temp[loop],"%s %d %ld", &name, &age, &salary);
Автор: redp
Дата сообщения: 30.03.2004 08:36
2Mickey_from_nsk
у тебя размер строки ограничен 511 байтами. А если тово - длиннее ?
кроме того getline некорректно обрабатывает текстовые файлы от UNIX

2Ternik
мало инфы как ты хочешь строку разобрать
возможно будет достаточно простого sscanf
возможно тебе помогут regular expressions вроде PCRE (http://www.pcre.org/)
либо lex/bizon
Автор: Ternik
Дата сообщения: 30.03.2004 19:39
redp
да... это простой лог-файл, из которого нужно подсчитать траффик...
разделяется ", " но почему то если я использу strtok, то короче очень печально все это заканчивается при наличии пробела.
А объясните тогда как прочитать строку через sscanf, пытался, ниче не получилось млин

Автор: redp
Дата сообщения: 31.03.2004 09:49
2Ternik
с ф-цией strtok есть две такие фишки
1) она портит строку, которую ты ей передаешь - вместо delimiterа кладет 0
2) чтобы получить следующий токен - ты должен отдать ей NULL, а не исходную строку. И так пока strtok не вернет тебе NULL
самый простой выход - использовать strtok с delimiter ",", а пробелы в начале и в конце строки вычищать самому
Автор: Ternik
Дата сообщения: 31.03.2004 18:53
redp
хм... скажи пожалуйста, как сделать это, как убрать пробел в начале строки?
Автор: redp
Дата сообщения: 01.04.2004 09:18
2Ternik
ну шо как маленький то
вот примерно так:

Код:
#include <ctype.h>

char *del_lead_spaces(char *ptr)
{
while( *ptr && isspace(*ptr) )
ptr++;
return ptr;
}
Автор: BoriSkin
Дата сообщения: 01.04.2004 10:28
за классы спасибо мужики иногда так вломак что-то делать у сами знаете, а тут подключил и кайфуешь
Автор: Yuliasha
Дата сообщения: 25.05.2009 20:39
Народ! подскажите как считывать из файла построчно в юниксе в консольке?
В двух файлах в каждой строке записано по одному целому числу, нужно просуммировать числа из первого и второго файлов, рассположенных в строках с одинаковым номером.
помогите пожалуйста, весь моск себе уже съела
Автор: alekc2008
Дата сообщения: 15.04.2010 18:40
#include <ctype.h>

char *del_lead_spaces(char *ptr)
{
while( *ptr && isspace(*ptr) )
ptr++;
return ptr;
}

Страницы: 1

Предыдущая тема: Многострочный DbGrid в Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.