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

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

Восстановить пароль Регистрация
 
black_tear
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 6
13.06.2012, 20:54     Считывание большого файла(~1гиг) #1
нужно считать текст из большого файла по 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.06.2012, 21:40     Считывание большого файла(~1гиг) #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);
}
А так, как это на более-менее современном С++ будет, Билдер скорее всего не поймёт...
Paporotnik
13.06.2012, 21:55
  #3

Не по теме:

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

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

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

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

Кстати почему бы не юзать getline() ?
получается все равно цикл создавать нужно будет если использовать гетлайн?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2012, 01:15     Считывание большого файла(~1гиг)
Еще ссылки по теме:

Заменить считывание с клавиатуры на считывание из файла C++
Считывание с файла C++
C++ Хеширование строк большого файла

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
14.06.2012, 01:15     Считывание большого файла(~1гиг) #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;
 }
В противном случае - да цикл и еще какой нибудь контейнер строк
Yandex
Объявления
14.06.2012, 01:15     Считывание большого файла(~1гиг)
Ответ Создать тему
Опции темы

Текущее время: 05:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru