Pages: (5) [1] 2 3 4 5  ( Show unread post )

> страдания по c++
 Lexus Member is Offline
 Posted: 19-03-2013, 15:16 (post 1, #1073291)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
У нас есть здесь спецы в c++?
Я тут начал работать ;) По профессии я математик, но програмировать надо больше чем считать. Пока проект не начался, я хотел немножко подготовиться. задача стоит простая:

считать с определённой директории список файлом и записать его в array/list

делал так, но ничего не выдаёт:

CODE

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <wtypes.h>
#include <string>

using namespace std;

bool FileExists(const TCHAR *fileName);
bool dirExists(const string& dirName_in);

int _tmain(int argc, _TCHAR* argv[])
{

const string Folder = "C:\\tests\\MUC unverdichtet\\";


 
HANDLE fHandle;
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd);
 
do
{

    if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgendes Verzeichnis wurde gefunden:",0);
        }
        else
        {
            MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgende Datei gefunden:",0);
        }
    }
}
while (FindNextFile(fHandle,&wfd));
FindClose(fHandle);

return 0;
}

как же я скучаю по c# ;&#041;))
PM Email Poster Users Website
Top Bottom
 Lord KiRon Member is Offline
 Posted: 20-03-2013, 00:15 (post 2, #1073331)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.

This post has been edited by Lord KiRon on 20-03-2013, 00:15
PM
Top Bottom
 Lexus Member is Offline
 Posted: 20-03-2013, 00:45 (post 3, #1073333)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
QUOTE (Lord KiRon @ 19-03-2013, 22:15)
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.
завтра попробую. спасибо. я тут не раз ешё буду доставать ;&#041;)
PM Email Poster Users Website
Top Bottom
 Lexus Member is Offline
 Posted: 20-03-2013, 13:07 (post 4, #1073350)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
CODE
const string Folder = "C:\\tests\\MUC unverdichtet\\*.*";


 
HANDLE fHandle;
WIN32_FIND_DATA wfd;
  string b = Folder+"*";
fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd);
 
do
{
    if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            cout<<wfd.cFileName<<endl;

        }
        else
        {
cout<<wfd.cFileName<<endl;;

        }
    }
}
while (FindNextFile(fHandle,&wfd));
FindClose(fHandle);
Output: 0013F8DC или другие подобные.

user posted image
PM Email Poster Users Website
Top Bottom
 Lord KiRon Member is Offline
 Posted: 20-03-2013, 19:57 (post 5, #1073356)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.


This post has been edited by Lord KiRon on 20-03-2013, 20:01
PM
Top Bottom
 Set Member is Offline
 Posted: 21-03-2013, 10:34 (post 6, #1073371)

Visionary

Group: Members
Posts: 5181
Warn:0%-----
Вспомнил, почему не перевариваю С++ :drag:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx
PM
Top Bottom
 Lexus Member is Offline
 Posted: 21-03-2013, 17:07 (post 7, #1073378)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
QUOTE (Lord KiRon @ 20-03-2013, 17:57)
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.
забил я на это и сделал через dirent :&#041;

Но не расслабляйтесь, всё только наинается=
PM Email Poster Users Website
Top Bottom
 Lord KiRon Member is Offline
 Posted: 23-03-2013, 00:50 (post 8, #1073457)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
QUOTE (Set @ 21-03-2013, 09:34)
Вспомнил, почему не перевариваю С++ :drag:
Плохому танцору...
:diablo:
PM
Top Bottom
 Lexus Member is Offline
 Posted: 30-03-2013, 15:31 (post 9, #1074041)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
Продолжимс :&#041;

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

std::vector<std::string> results
while(getline(ss.str,separator)
{
results.push_back(str);
}

и этот грёбанный пушбек жрёт 90% моего времени. Я пробывал сначала толкать в лист, в нём судя по описанию пушбек добрее, а потом коппировать в вектор. Но что-то всё стало медленнее чем))))

Можно ли как-то это обойти?
PM Email Poster Users Website
Top Bottom
 Lord KiRon Member is Offline
 Posted: 31-03-2013, 01:07 (post 10, #1074078)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
PM
Top Bottom
 Lexus Member is Offline
 Posted: 31-03-2013, 02:14 (post 11, #1074083)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
QUOTE (Lord KiRon @ 30-03-2013, 23:07)
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
Память меня меньше CPU напрягает)))))
PM Email Poster Users Website
Top Bottom
 Set Member is Offline
 Posted: 31-03-2013, 07:45 (post 12, #1074086)

Visionary

Group: Members
Posts: 5181
Warn:0%-----
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
PM
Top Bottom
 Lexus Member is Offline
 Posted: 31-03-2013, 11:42 (post 13, #1074091)

Коллекционер
Group: Global Moders
Group: Global Moders
Posts: 10401
QUOTE (Set @ 31-03-2013, 06:45)
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?
PM Email Poster Users Website
Top Bottom
 Lord KiRon Member is Offline
 Posted: 31-03-2013, 17:49 (post 14, #1074116)

Part time flamer

Group: Read Only
Posts: 7784
Warn:0%-----
Если ты утверждаешь что память вообще не проблема , то открывай файл черз mapped view (чтоб он при доступе "выглядел" как бафер, а не файл) и сохраняй позиции запятых в файле в отдельный вектор.
Походу можно не пользоватся вектором а хранить в массиве используя doubling, то есть держишь массив созданный через new скажем на 1000 мест и переменную "индекс" последнего свободного места + переменную размера массива.
Если дошел до последнего (1000-го) то создаешь новый массив в два раза большр (то-есть 2000) и копируешь в него старый memcopy , а старый освобождаешь и так далее...
операции подстановки лонгов в массив почти мгновенные, копирование непрерывного блока памяти тоже операция достаточно быстрая и в принципе будет (при правильно выбранном начальном размере) достаточно редкой.
Если память вообще не ограничена :&#041; можешь создать массив вообще один раз - размером с файл, тогда точно ничего и копировать не придется :&#041;

This post has been edited by Lord KiRon on 31-03-2013, 17:50
PM
Top Bottom
 FiL Member is Offline
 Posted: 31-03-2013, 23:53 (post 15, #1074131)

Сварливый Мозг Клуба
Group: Roots
Group: Roots
Posts: 22885
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?

Ну и таки если уж так хочется засовывать весь файл в память (несколько странно в этом разрезе говорить о гигантских файлах), то ты-бы место в векторе выделял крупными кусками. А то для каждой строки вызывается реаллокация памяти, ибо вектор переполнился. Выделил место по 1000 строк - считал 1000. Потом снова выделил одним разом еще под 1000. И так далее. Ну, или если строк всегда более миллиона, то можно не по 1000, а по 100.000 за итерацию.
PM Email Poster ICQ AOL MSN
Top Bottom
Topic Options Pages: (5) [1] 2 3 4 5