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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считать весь файл 
V
    Опции темы
vood
Дата 27.10.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



доброго времени суток!
Столкнулся я с такой проблемой : не получается весь файл считать !
Подскажите более удобное решение(мое решение ниже smile  и не работает)
Код

while (!ReadFile(hFile,str,1024, &dwBytesRead, NULL)); 
{
...
memset(&str,0,1024);
}



--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
_hunter
Дата 27.10.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 98



Цитата

If the function succeeds, the return value is nonzero.

т.е. нужно while (ReadFile(...))


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Coala
Дата 27.10.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А кто мешает определить размер файла, создать буфер соответствующего размера и за один заход считать весь файл в буфер?
ЗЫ - что с файлом-то делать надо?

PM MAIL   Вверх
Kuvaldis
Дата 27.10.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 11
Всего: 61



Coala
Цитата

А кто мешает определить размер файла, создать буфер соответствующего размера и за один заход считать весь файл в буфер?

Да, интересно будет считывать файл размером метров хотя бы в 600 smile 

Должен быть РАЗУМНЫЙ компромис между скоростью (количество операций чтения) и памятью (размером буфера) 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
vood
Дата 27.10.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



_hunter, у меня компилятор ругается если ставить так
Код

while (ReadFile(hFile,str,1024, &dwBytesRead, NULL));



--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
SergeCpp
Дата 27.10.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

Репутация: 15
Всего: 124



Точку с запятой уберите в конце строки, однако... user posted image

while( ReadFile( hFile, str, 1024, &dwBytesRead, NULL ) ); // вот эту вот

PM MAIL WWW ICQ   Вверх
vood
Дата 27.10.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это опечатка. Но экзешник после изменения 
Код

while (!ReadFile(hFile,str,1024, &dwBytesRead, NULL)) 

на
Код

while( ReadFile( hFile, str, 1024, &dwBytesRead, NULL ) )
 
 очень глючит

Это сообщение отредактировал(а) vood - 27.10.2006, 11:42


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Kuvaldis @  27.10.2006,  09:47 Найти цитируемый пост)
Да, интересно будет считывать файл размером метров хотя бы в 600 smile 

Ну вроде ведь задача так стоит: "считать весь файл сразу". Значит наверное автор проверяет длину перед зачитыванием smile
Вот кросплатформенная функция определения длины файла
Код

#include <sys/stat.h>
long fileLength(const char* filename)
{
    struct stat buf;
 
    if(stat(filename, &buf) != 0)
    {
        /* Произошла проблема при получении информации */
        return -1;
    }
    return (buf.st_size);
}




Аот тебе простой, кросплатформенный пример копирования файла.
Не раз ещё пригодится  smile 
Если за размер буффера возьмёшь длину файла, то он считается "за раз";
Код

//by http://vingrad.ru/@sergejzr
#include <stdio.h>
#include <io.h>

int main(int argc, char *argv[])
{
FILE * in, * out; //Файлы ввода/вывода
int  n; //Количество зачитанных байт
int buffersize=512; //Величина буффера копирования
char * buf =new char[buffersize]; //буффер для копирования

in=fopen(argv[1],"rb"); //Открываем файл для чтения
out=fopen(argv[2],"wb");//И для записи
// while - Цикл копирования
//Копирует по кусочку.
while ((n = read(fileno(in), buf, buffersize) > 0) //Считай n байт
 {
   write(fileno(out), buf, n);   //Запиши их
 }
delete buf ;//Удаляем мусор
fclose(in);fclose(out);//Закроем файлы.
 return 0;
}




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



sergejzr, длину файла я определяю функцией _findfirst
за функцию копирования спасибо, но я пытаюсь считать весь файл( и за один присест у меня это не получится)


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(vood @  27.10.2006,  11:08 Найти цитируемый пост)
sergejzr, длину файла я определяю функцией _findfirst

Зачем её каждый раз определять, когда она в таблице уже есть?

Цитата(vood @  27.10.2006,  11:08 Найти цитируемый пост)
( и за один присест у меня это не получится) 

Почему? Файл большой?



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это просто долго) файлов нужно много обрабатывать
определять нужно тк у себя модуля sys/stat.h я не нашел
а findfirst мне удобней

Добавлено @ 12:21 
но мой вопрос еще остается в силе(см 1 пост)


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Тогда я не понимаю смысл вопроса и проблемы
Цитата(vood @  27.10.2006,  09:19 Найти цитируемый пост)
Столкнулся я с такой проблемой : не получается весь файл считать !

Разве ЭТО не считает весь файл?
Код

//by http://vingrad.ru/@sergejzr
#include <stdio.h>
#include <io.h>
int main(int argc, char *argv[])
{
FILE * in; //Файл
int  n; //Количество зачитанных байт

in=fopen(argv[1],"rb"); //Открываем файл для чтения

int buffersize=fileLength(argv[1]); //Величина буффера копирования
char * buf =new char[buffersize]; //буффер для копирования

if (!(read(fileno(in), buf, buffersize) > 0)
{
//Чтото не так с файлом
return -1;
}

//Вот в буффере весь файл
printf(buf);

delete buf ;//Удаляем мусор
fclose(in);//Закроем файлы.
 return 0;
}



ПС:
sys/stat.h - стандартная вещь есть в любом компиляторском наборе. Что у тебя за компилер?
Хотя конечно, бегай по файлу, если есть желание.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



sergejzr, понимаете, меня сам метод Ваш не устраиваетю. Файлы  надо обрабатывать по 50-60 кб, экзешник будет запущен не раз, а память у меня на компе всего 512мб. Лично Вам огромное спасибо за участие, но я бы хотел узнать еще и другие мнения.


Это сообщение отредактировал(а) vood - 27.10.2006, 12:29


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
jnb
Дата 27.10.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробуй использовать проецируемые в память файлы.
В таком случае сразу получишь указатель на буфер и избавишься от необходимости копирования файлов в память.

Почитать можно у Рихтера.
PM MAIL   Вверх
vood
Дата 27.10.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какой такой Рихтер?


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
Coala
Дата 27.10.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(vood @  27.10.2006,  13:28 Найти цитируемый пост)
а память у меня на компе всего 512мб
Всего...У многих и 256 нету
Цитата(vood @  27.10.2006,  13:28 Найти цитируемый пост)
Файлы  надо обрабатывать по 50-60 кб
Разве это размер? Это мелочь, а не файлы.
1. Определяешь размер файла filesize
2. Выделяешь буфер этого размера char *buf = new char[filesize]
3. Читаешь файл целиком ReadFile(hFile, buf, filesize, &dwBytesRead, NULL );
4. Что ты там с ним дальше будешь делать - не знаю...
5. Но после всех обработок освободи память - delete [] buf.
6. Можешь начать обрабатывать следующий файл - goto п.1

PM MAIL   Вверх
jnb
Дата 27.10.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(vood @  27.10.2006,  12:34 Найти цитируемый пост)
Какой такой Рихтер?


Вот ссылка на главу из его книги:
http://wm-help.net/?books-online/book/59464/59464-10.html
PM MAIL   Вверх
sergejzr
Дата 27.10.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(jnb @  27.10.2006,  11:33 Найти цитируемый пост)
Попробуй использовать проецируемые в память файлы.
В таком случае сразу получишь указатель на буфер и избавишься от необходимости копирования файлов в память.

Это Memory Mapped Files?

Вдё равно файл в память там копируется. И мой вариант быстре будет. (вообще, наврядли чтото ещё более быстрое есть, если только на асме писать..)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coala
Дата 27.10.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Люди! Одумайтесь! Ради 60 кил маппингом заниматься?
PM MAIL   Вверх
_stranger_
Дата 27.10.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробуй так

Код

do 
      {
        
        Result =  ReadFile(hFile,str,1024, &dwBytesRead, NULL);
        ...
        memset(&str,0,1024);

      } while (Result && dwBytesRead == 1);

 
что-то типа этого ...
PM MAIL   Вверх
vood
Дата 27.10.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



экзешник истошно зовет DWWIN.EXE(то бишь не работает)

Это сообщение отредактировал(а) vood - 27.10.2006, 12:51


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
jnb
Дата 27.10.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(sergejzr @  27.10.2006,  12:43 Найти цитируемый пост)
Вдё равно файл в память там копируется.


Вроде не совсем так. Файл используется так же как page file, который кстати тоже является памятью системы. И мы точно в этом случае избавляемся от лишнего копирования.


Цитата(sergejzr @  27.10.2006,  12:43 Найти цитируемый пост)
И мой вариант быстре будет

Без сомнения. Но у каждого метода есть плюсы и минусы. Причем vood скорее озабочен экономией памяти а не процессорного времени.


Да и вообще пусть почитает, как с файлами работать можно.
PM MAIL   Вверх
vood
Дата 27.10.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Компелирую под DEV c++
вот весь код, может в нем баг
Код

#include <iostream>
#include <windows.h>

using namespace std;

void str_repl(char* natasha,char ira, char rita )
{
int t;
for (t=0;t<strlen(natasha);t++) if (natasha[t]==ira) natasha[t]=rita;
}

void del_str(char* natasha,int olya)
{
char tmp[1024]="";
int t;
for (t=olya;t<strlen(natasha)+1;t++) tmp[t-olya]=natasha[t];
memset(natasha,0,sizeof(natasha));
strcpy(natasha,tmp);    
}

int pos(char* natasha, char ira )
{
int t;
for (t=0;t<strlen(natasha);t++)
{
if (natasha[t]==ira){
return t+1;                     
break;
}
}
return 0;
}

int main(int argc, char *argv[])
{
int olesya,i=0;
HANDLE hFile,s;
DWORD dwBytesRead=1;
char str[1024]="0";
char buff[1024]="\0";
char masha[90]="<>,:;'?/\|)(*&^%$#![]{}éöóêåíãøùçõúýæäëîðïàâûôÿ÷ñìèòüáþÉÖÓÊÅÍÃØÙÇÕÚÝÆÄËÎÐÏÀÂÛÔß×ÑÌÈÒÜÁÞ¹+=";
//scanf("%s",str);
/*_finddata_t k;
if(_findfirst(argv[1],&k)==0) exit(0);*/
hFile = CreateFile(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
s=CreateFile("e-mails.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
SetFilePointer(s, 0, NULL, FILE_END);
do//for (i=0;i<(k.size-(k.size%1024))/1024;i++)
{
i= ReadFile(hFile,str,1024, &dwBytesRead, NULL);
str[strlen(str)]=';';
for (olesya=0;olesya<strlen(masha);olesya++) str_repl(str,masha[olesya],' ');
//printf("%s\n",str);
while(pos(str,' ')>0)
{
strncpy(buff,str,pos(str,' '));
if (pos(buff,'@')>0 && pos(buff,'.')>0){
buff[strlen(buff)]='\n';
WriteFile(s,buff,strlen(buff), &dwBytesRead, NULL);
}
del_str(str,pos(str,' '));
memset(&buff,0,1024);
}
memset(&str,0,1024);
}while (i && dwBytesRead == 1);
CloseHandle(hFile); 
CloseHandle(s);
system("PAUSE");
}


Экзешник запускается с параметром имя входного файла. В выходном файле (e-mails.txt) должны быть все подстроки из входного которые содержат хотябы 1 точку и собаку

Это сообщение отредактировал(а) vood - 27.10.2006, 12:57


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(jnb @  27.10.2006,  11:52 Найти цитируемый пост)
Причем vood скорее озабочен экономией памяти а не процессорного времени.

Хмм. А это что тогда?
Цитата(vood @  27.10.2006,  11:16 Найти цитируемый пост)
это просто долго)


А вообще уже два примера дал и зачитание "за раз" и буффером "частями".
Короче, я наверное не понимаю, вопроса и проблемы smile Потому как, что ReadFile, что read - одно и тоже (хотя read быстрее). 
Вообще, всё выглядит так, что с файлом чтото не в порядке, а не с кодом.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



sergejzr, файл обычный текстовый


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
jnb
Дата 27.10.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Coala @  27.10.2006,  12:45 Найти цитируемый пост)
Люди! Одумайтесь! Ради 60 кил маппингом заниматься? 


файлов нужно много обрабатывать (с) vood

60 кил * много файлов = много кил.
к томуже мы не знаем точно, что конкретно надо сделать.

Да и лишняя информация никогда не повредит.
PM MAIL   Вверх
sergejzr
Дата 27.10.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



vood, т5ы бы ещё пару фйлов - данных скинул


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это весь исходник


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Ты же какие-то файлы зачитываешь! Исходник сам по себе работает.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



он не много не читабелен изза того что половина переменных названа женскими именами


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



И вообще: "<>,:;'?/\|)
скорее всего должно быть: "<>,:;'?/\\|)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот файл.

Это сообщение отредактировал(а) vood - 27.10.2006, 13:07

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  index.txt 17,56 Kb


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



И проблема у тебя по-видимому в этой строчке: 
for (olesya=0;olesya<strlen(masha);olesya++) str_repl(str,masha[olesya],' '); 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ее смысл: заменить все  символы массива маша из строки str на пробелы

Добавлено @ 13:11 
как он может быть причиной проблемы если в предыдущих версиях(которые считывали только один раз буфером в 1024б) все работало хорошо?

Это сообщение отредактировал(а) vood - 27.10.2006, 13:13


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
jnb
Дата 27.10.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



i= ReadFile(hFile,str,1024, &dwBytesRead, NULL);
str[strlen(str)]=';';

не понятно:
читает из файла 1024 байта.
потом получает длину строки до первого "\n"
запихивает на это место ;
а если не встретился в этих 1024 байтах "\n" или он как раз 1024тый, то получит невалидный индекс

лучше читать этот файл по строкам


PM MAIL   Вверх
vood
Дата 27.10.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



помоему strlen всегда считал длину всей строки, включая #13?


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(vood @  27.10.2006,  12:10 Найти цитируемый пост)
как он может быть причиной проблемы если в предыдущих версиях(которые считывали только один раз буфером в 1024б) все работало хорошо?


А так, например, что кусок файла, это ещё далеко не string и кидать его в функции типа strlen, str_replace, printf нельзя. ("нормальная" строка заканчиваетс '\0')
Во цторых, ты считываешь по 1024 байт, а количество натурально считанных байт это i и оно может отличаться от 1024. (На все же файлы кратны 1024).
Ну короче, там много недоработок в связи с тем, что кусками читаешь. Посмотри, подумай, исправь, а потом уже дальше будем думать.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



понятно. Вопрос (с ходу): strlen заменить на sizeof?


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Предварительно проблема решается обьявлением:

char str[1025]="0";
и модификацией
i= ReadFile(hFile,str,1024, &dwBytesRead, NULL);
str[i]=0;


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coala
Дата 27.10.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(jnb @  27.10.2006,  13:58 Найти цитируемый пост)
файлов нужно много обрабатывать (с) vood

60 кил * много файлов = много кил.

Не, ну если в цикле память не чистить, то можно и 2-х гектарную память за...ать
Код

  // файлы открыли, узнали размер исходного файла и считали его в buf за один раз
  char *p = strtok(buf, "@.");
  while (p) {
    if ((strchr(p, '@')) && (strchr('.')) {
      // нашли строку, в которой есть и точка, и собака
    }
    p = strtok(NULL, "@.");
  }

PM MAIL   Вверх
sergejzr
Дата 27.10.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(vood @  27.10.2006,  12:22 Найти цитируемый пост)
понятно. Вопрос (с ходу): strlen заменить на sizeof?

Нет!
Обьясняю сразу. sizeof ты можешь пользоваться только если сам где-то эту величину указал или на стандартных типах данных.
Ты указал ввеличину выше char str[1024] А значит sizeof всегда вернёт тебе 1024.

Единственно правильно о длине говорит i


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



НО ведь ReadFile возвращает булеан?
а размер прочитанного стоит в dwBytesRead


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Точно. Значит его надо использовать вместо i.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добился того что не вылетает
Код

while (ReadFile(hFile,str,1024, &dwBytesRead, NULL)==0)
{
str[dwBytesRead]=0;

похоже ошибка возникала изза этого нулевого байта

Это сообщение отредактировал(а) vood - 27.10.2006, 13:32


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Можно ещё спросить, что вы с исходниками форума делает?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это вы мне?


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



А кому? В приаттаченном файле - исходинк форума


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я вообще только для тестирования использую.
тк они имеют сложную структуру для парсинга

Добавлено @ 13:36 
какой блин исходник?это просто хтмл код одной его странцы


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
sergejzr
Дата 27.10.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(vood @  27.10.2006,  12:35 Найти цитируемый пост)
какой блин исходник?это просто хтмл код одной его странцы 

ХТМЛ код и есть исходный код страницы. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
vood
Дата 27.10.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Заработало!!!!Наконецто!!

Добавлено @ 13:49 
sergejzr, ты мужжик! Спасибо тебе!!


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1840 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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