Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нужно узнать количество строк...


Автор: drZmeu 24.1.2007, 09:37
Возникла проблема... Все наверное знают как кодируется base64 кто незнает сейчас расскажу =)
в принцепе неважно как это всё кодируется но допустим есть
файл
в нём 17 строк по 76 символов
и одна строка около 16 символов.
Вот мне нужно както передать всё это дело по SMTP но чтоб размер после передачи файла не изменился...
Я пытался вчера один рас размер файла вышел такой какой нужно... Но пришлосб в ручную считать строки и указывать сколько их.
После я попытался читать файл по символам...
Зазмер увеличился на несколько байт может это и неочень страшно но файл при постоянной передаче будет постоянно расти а это не есть хорошо =\
Вопрос как средствами WinAPI в среде Visual C++ узнать сколько строк в файле ? 
Точнее мне както нужно узнать сколько там строк а после прочитать каждую строку по 76 символов...
Я пытался парсировать таким методом:

Код

buf[1] //Читаем по одному символу
DWORD iByte;
int line;
ReadFile("g.bin",buf,1,&iByte,NULL);
if(buf[0]=='13' && buf[1]=='10')
{
line++; //Найден конец строки значит есть одна строка...
}


Вот примерно так я и читал + пытался по 2 символа. + SetFilePointer
Вобшем много чего пытался... Не очень получилось...
Вопрос как узнать сколько в файле строк желательно средствами WinAPI + ReadFile.

Автор: KelTron 24.1.2007, 09:59
Цитата(drZmeu @  24.1.2007,  09:37 Найти цитируемый пост)
Вопрос как узнать сколько в файле строк желательно средствами WinAPI + ReadFile.

А что ReadFile это разве не WinAPI? да и по чему ты не хочешь воспользоваться STL 

Автор: szz 24.1.2007, 10:32
Кажется это одно из первых заданий в КерниганРичиЯзыкПрограммированияСи

Автор: drZmeu 24.1.2007, 10:43
На сколько я помню там чистый C++
Мне нужен минимальный размер и максимальная производительность =\
В проекте Используется немного C + WinAPI + ASM

Автор: drZmeu 24.1.2007, 14:39
вопрос остаётся не решонным.

Автор: W4FhLF 24.1.2007, 14:45
Что конкретно тебя интересует? Сам алгоритм определения числа строк или его реализация вкупе с WinApi? Обычный поиск всех символов переноса строки(0x0A) вполне подойдёт, есть конечно и более эффективные алгоритмы, но и при простом поиске символа переноса производительность определяется миллионами строк за 1/2 секунды, примерно. 

Автор: drZmeu 24.1.2007, 16:35
Тоесть использовать метод парсинга который использовал я но указывать 0x0D и 0x0A..
Если нет то можно примерчик плзззз... smile 

Автор: W4FhLF 24.1.2007, 17:01
Ну ты искал строки '13' '10', а надо искать числовые значения(коды символов). 0x0A - это 10 в шестадцатиричном представлении, ну стыдно такое не знать программисту. Если у тебя большой файл(> 30-40 мегабайт) читай блоками по 4096 байт или скидывай файл в своп(Memory Mapped Files) и ищи в них байты со значением 10. Вот и весь алгоритм. 

Автор: drZmeu 24.1.2007, 17:07
Мда.......
Мне бы с использованием ReadFile + я знаю что такое HEX...

Добавлено @ 17:19 
Ок вопрос №2...
Почему когда я читаю файл примерно вот так:
[code=cpp]
DWORD iByte;
char buf[1];
HANDLE THREAD;
for(DWORD i=0;i<fsize;i++)
{
SetFilePointer(THREAD,i,0,NULL);
ReadFile(THREAD,buf,1,&iByte,NULL);
send(s,buf,strlen(buf),0);
Код


}

Получается такая тема что в файле до кодирования в base64 всё ок.
после передачи файла... Он перекодируется автоматом в нормальный вид: у меня получается какоето смешение мне кажется я передаю немного лишней информации... + файл увеличивуается на несколько байт =\

Добавлено @ 17:20 
Блин =(

Код

DWORD iByte;
char buf[1];
HANDLE THREAD;
for(DWORD i=0;i<fsize;i++)
{
SetFilePointer(THREAD,i,0,NULL);
ReadFile(THREAD,buf,1,&iByte,NULL);
send(s,buf,strlen(buf),0);
}

Автор: W4FhLF 24.1.2007, 17:31
Вот тебе код, который считает кол-во строк в файле, реализовано всё на WinApi. 

Код

#include <WIN.H>
#include <stdio.h>

typedef unsigned int dword;

int main(int argc, char* argv[])
{
    dword Bytes, count = 0;
    
    HANDLE hFile = CreateFile("E:\\Temp\\English.txt", GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + 
                    FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    dword dwSize = GetFileSize(hFile, 0);
    char *pMemory = VirtualAlloc(0, dwSize, MEM_COMMIT, PAGE_READWRITE);
    ReadFile(hFile, pMemory, dwSize, &Bytes, 0);
    CloseHandle(hFile);
    
    for (dword i = 0; i <= dwSize; i++)
        if ( *(pMemory+i) == 0x0A) count++;
    
    VirtualFree(pMemory, dwSize, MEM_DECOMMIT);
    
    printf("%d", count);
    getch();
    return 0;
}



Автор: drZmeu 24.1.2007, 17:49
Во пасибо большое  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)