Sczytanie tekstu z pliku do zmiennej

0

Nie chce mi sczytać z pliku tekstowego tekstu do zmiennej. Przy tworzeniu notatki tekst jest zapisywany w jednej linii(trzeba przesuwać w prawo, aby przeczytać tekst), więc nie ma potrzeby czytać kolejnych linii, wystarczy pierwsza.

void Klient::czytaj_notatke(string nazwy_notatek[], int *ilosc, string *stringPIN)
{
    fstream plik;
 
    int nr;
    string tresc;
 
    while(true)
    {
        cout << endl << endl;
        cout << "Podaj numer notatki: ";
        cin >> nr;
 
        if(!nr)
        {
            cout << endl << endl;
            cout << "Podaj numer!";
            Sleep(2000);
        }
        else
        {
            WIN32_FIND_DATA File_Data;
 
            FindFirstFile(TEXT(("NOTATKI/" + *stringPIN + "/*.txt").c_str()), &File_Data);
            for(int i = 0; i < *ilosc; i++)
            {
                if(File_Data.cFileName == nazwy_notatek[nr])
                    plik.open(nazwy_notatek[nr].c_str(), ios::in);
                else
                {
                    HANDLE hfile = FindFirstFile(TEXT(("NOTATKI/" + *stringPIN + "/*.txt").c_str()), &File_Data);
 
                    while(FindNextFile(hfile, &File_Data))
                    {
                        if(File_Data.cFileName == nazwy_notatek[nr])
                        {
                            plik.open(nazwy_notatek[nr].c_str(), ios::in);
                            break;
                        }
                    }
                    FindClose(hfile);
 
                    break;
                }
            }
 
            system("cls");
 
            //while(!plik.eof())
            //{
                plik >> tresc;
            //}
 
            cout << endl << "Nazwa: " << File_Data.cFileName;
            cout << endl << endl << "Tresc: " << tresc;
 
 
            getchar();getchar();
            break;
        }
    }
} 
2

O nie, nie, nie, nie. W tej metodzie dzieje się za dużo - masz tam jakieś czytanie wejścia, jakieś szukanie plików oraz coś tam jeszcze otwierasz. Każda z tych czynności powinna być wydzielona do osobnych uniwersalnych metod/klas (w miarę możliwości).
Na pierwszy ogień na pewno szukanie plików można przerzucić do klasy w stylu Filesystem, potem zastanowimy się, co w ogóle ten kod robi/czego nie robi.

1
  1. Nie używaj postinkrementacji: http://4programmers.net/Forum/1101404
  2. Przekazujesz *ilosc przez wskaźnik, po kiego?
  3. Próbujesz znaleźć plik, po czym nie zależnie od tego czy udało się czy nie *ilosc razy sprawdzasz czy to właśnie ta nazwa, WTF?
  4. Szukasz pliku i jeżeli nie jest to pierwszy znaleziony to znowu zaczynasz kolejne szukanie bez zamknięcia poprzedniego, WTF?
  5. Jeżeli już szukasz to:
HANDLE hfile=FindFirstFile( ... ,&File_Data);
for(BOOL flag=hfile!=INVALID_HANDLE_VALUE;flag;flag=FindNextFile(hfile,&File_Data))
  {
   if(File_Data.cFileName==nazwy_notatek[nr])
     {
      plik.open(nazwy_notatek[nr].c_str(),ios::in);
      break;
     }
  }
FindClose(hfile);

żadnych dodatkowych pętli, żadnych podwójnych otwierań.
6. Jeżeli już znasz nazwę pliku: File_Data.cFileName==nazwy_notatek[nr] to czemu musisz szukać, czemu nie otworzyć od razu: plik.open(nazwy_notatek[nr].c_str(),ios::in);

1 użytkowników online, w tym zalogowanych: 0, gości: 1