Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно узнать количество строк... Кольчество строк басе 64 
V
    Опции темы
drZmeu
  Дата 24.1.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



Возникла проблема... Все наверное знают как кодируется 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.
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
KelTron
Дата 24.1.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



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

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



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
szz
Дата 24.1.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: нет
Всего: 33



Кажется это одно из первых заданий в КерниганРичиЯзыкПрограммированияСи


--------------------
PM   Вверх
drZmeu
Дата 24.1.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



На сколько я помню там чистый C++
Мне нужен минимальный размер и максимальная производительность =\
В проекте Используется немного C + WinAPI + ASM
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
drZmeu
Дата 24.1.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



вопрос остаётся не решонным.
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
W4FhLF
Дата 24.1.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
drZmeu
Дата 24.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



Тоесть использовать метод парсинга который использовал я но указывать 0x0D и 0x0A..
Если нет то можно примерчик плзззз... smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
W4FhLF
Дата 24.1.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



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

Это сообщение отредактировал(а) W4FhLF - 24.1.2007, 17:08


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
drZmeu
Дата 24.1.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



Мда.......
Мне бы с использованием 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);
}

--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
W4FhLF
Дата 24.1.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Вот тебе код, который считает кол-во строк в файле, реализовано всё на 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;
}




Это сообщение отредактировал(а) W4FhLF - 24.1.2007, 17:33


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
drZmeu
Дата 24.1.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



Во пасибо большое  smile 

--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.