Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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