Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
black_tear
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 6
#1

Считывание большого файла(~1гиг) - C++

13.06.2012, 20:54. Просмотров 662. Ответов 7
Метки нет (Все метки)

нужно считать текст из большого файла по 1мб так, чтобы потом можно было потом обрабатывать строки(фильтровать). использовать функции библиотеки string нельзя. писала так
C++
1
2
3
4
5
6
7
8
while(!feof(f)){
str="";
while(!n==mb||!feof(f)){
c = fgets(line,1000000,f);
w=strncat(str, line, strlen(line));
str+=line[i];
i++;
n=strlen(str);}}
мне сказали так нельзя. нужно как то сделать с помощью функций read и seek. но если использовать reed он же считывает блоком, и может считать только половину строки.
Подскажите пожалуйста как сделать правильно

P.S. делаю в С++Builder
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 20:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание большого файла(~1гиг) (C++):

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Быстрое заполнение большого файла - C++
Здравствуйте! Возникла проблема в работе с большим файлом: возникла необходимость быстро заполнять некоторый участок большого файла...

Сортировка очень большого файла. - C++
вопрос таков: есть очень большой файл, его нужно отсортировать. Так как файл большой его нужно извлекать по частям. Как это можно...

Хеширование строк большого файла - C++
Здравствуйте! Помогите, пожалуйста разобраться с процессом хеширования. Задача состоит в том, что мне дан текстовый файл примерно в 100Мб...

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Максимальное быстрое создание большого файла - C++
У кого какие алгоритмы создания максимально быстро файлов, больших размеров?

7
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
13.06.2012, 21:40 #2
black_tear, то есть файл всё-таки целиком должен в памяти оказаться? Вот так на С может выглядеть:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
#define APP_NAME  argv[0]
#define FILE_NAME argv[1]
 
int main(int argc, char ** argv){
    FILE * f;
    char * pPos, * pContent;
    long nLength, nReaden;
    
    if ( argc < 2 ) {
        fprintf(stderr, "Usage: %s input_file_name\n", APP_NAME);
        exit(1);
    }
    
    if ( ! ( f = fopen(FILE_NAME, "rb") ) ) {
        fprintf(stderr, "%s: can't open %s for input!", APP_NAME, FILE_NAME);
        exit(1);
    }
    
    if ( fseek(f, 0, SEEK_END) ) {
        perror("fseek");
        if ( fclose(f) )
            perror("fclose");
        exit(1);
    }
    if ( ( nLength = ftell(f) ) < 0 ) {
        perror("ftell");
        if ( fclose(f) )
            perror("fclose");
        exit(1);
    }
    if ( nLength == 0 ) {
        fprintf(stderr, "%s: file %s is empty, try another one.\n", APP_NAME, FILE_NAME);
        if ( fclose(f) )
            perror("fclose");
        exit(1);
    }
    rewind(f);
    
    if ( ! ( pContent = malloc(nLength) ) ) {
        perror("malloc");
        if ( fclose(f) )
            perror("fclose");
        exit(1);
    }
    
    for ( pPos = pContent; ( nReaden = fread(pPos, sizeof(char), BUFSIZ, f) ); pPos += nReaden )
        ;
    
    if ( ferror(f) ){
        fprintf(stderr, "%s: error while reading file!\n", APP_NAME);
        free(pContent);
        if ( fclose(f) )
            perror("fclose");
        exit(1);
    }
    
    if ( fclose(f) ) {
        perror("fclose");
        free(pContent);
        exit(1);
    }
    
    /* do somethink with content */
    for ( pPos = pContent; pPos - pContent < nLength; ++pPos )
        putchar(toupper(*pPos));
    
    free(pContent);
    exit(0);
}
А так, как это на более-менее современном С++ будет, Билдер скорее всего не поймёт...
0
Paporotnik
13.06.2012, 21:55
  #3

Не по теме:

int main(int argc, char ** argv)
а такое билдер понимает?)

0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
13.06.2012, 22:14 #4
Цитата Сообщение от Paporotnik Посмотреть сообщение
а такое билдер понимает?)
А почему бы ему это не понять? Это может в каком-то смысле и не совсем корректный, но вполне валидный синтаксис С, а с этим у билдера, на сколько знаю, проблем не бывает...
Считывание большого файла(~1гиг)

А вот со всякими namespace и заголовками без расширений таки могут быть проблемы.
0
black_tear
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 6
13.06.2012, 23:54  [ТС] #5
а если с помощью этого считывать строки и потом обрабатывать? не будет тормозить если файл будет огромный?
C++
1
2
TStringList *list = new TStringList;
   list->LoadFromFile(OpenDialog1->FileName);
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,790
Записей в блоге: 17
14.06.2012, 00:10 #6
Поидее должен тормозить больше(чем обычными методами)...но так легче....

Кстати почему бы не юзать getline() ?
0
black_tear
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 6
14.06.2012, 00:44  [ТС] #7
Цитата Сообщение от Avazart Посмотреть сообщение
Поидее должен тормозить больше(чем обычными методами)...но так легче....

Кстати почему бы не юзать getline() ?
получается все равно цикл создавать нужно будет если использовать гетлайн?
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,790
Записей в блоге: 17
14.06.2012, 01:15 #8
Необязательно если размер файла известет...
C++
1
2
3
4
5
6
7
8
ifstream f("1.txt");
char buf[255];
if(!f) cerr<<"error"<<endl;
else
 {
 f.getline(buf,254,'\0');
 cout<<buf;
 }
В противном случае - да цикл и еще какой нибудь контейнер строк
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2012, 01:15
Привет! Вот еще темы с ответами:

Быстрое чтение большого файла. Зависает процесс - C++
Всем доброго времени суток. Есть задача прочитать файл(1-20 мб), который состоит из слов разделённых пробелами для того, чтобы переписать...

Высчитывание оптимального размера буфера при копировании большого файла - C++
Здравствуйте! Программа может копировать большие файлы(&gt;4GB). Но немалую роль играет оптимизация самого процесса копирования. Думаю всем...

Функция fopen() для большого текстового файла читает только первую строку - C++
Есть текстовой файл 4.5 мб, нужно его открыть для чтения из него строк. FILE *f = fopen(&quot;C:\\members.txt&quot;, &quot;r&quot;); Это мне...

Считывание с файла ! - C++
Всем доброе врямя суток ! Помогите пожалуйста мне надо чтобы прога считывала из файла не до пробела а запихивала в символьный массив прям...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
14.06.2012, 01:15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru