Otwieranie plikow txt w petli?

0

Jak otwierac pliki po kolei z danego katalogu?
Zalozmy ze mam folder w ktorym jest 5 plikow txt i chcialbym aby pewna czynnosc zostala przeprowadzona na kazdym z nich. Jak mogę zrobić pętle ktora bedzie otwierac kazdy nastepny plik?

2

Musisz wydobyć nazwy tych plików, jak się pewnie domyślasz.
//EDIT
http://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c

1
mając listę nazw wszystkich plików (tutaj: w folderze)
dla każdej nazwy w liście z nazwami plików:
    otwórz plik znajdujący się pod podaną nazwą
    operuj na pliku
0

Probuje ale cos mi nie wychodzi :/ czy mógłby ktoś mi to pokazać na konkretnym przykładzie?

0

Testowałem na GNU C++ (MinGW), pliki txt w katalogu C:, wyświetlanie ich zawartości:

 
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

int main()
{
    FILE *f;
    char c;
    string path = "c:\\";
    string searchPattern = "*.txt";
    string fullSearchPath = path + searchPattern;

    WIN32_FIND_DATA FindData;
    HANDLE hFind;

    hFind = FindFirstFile( fullSearchPath.c_str(), &FindData );

    if( hFind == INVALID_HANDLE_VALUE )
    {
        cout << "Blad przeszukiwania katalogu\n";
        return -1;
    }

    do
    {
        string filePath = path + FindData.cFileName;
        cout << filePath << ": "<< "\n\n";
        
        f = fopen(filePath.c_str(), "r");
        while ((c = fgetc(f)) != EOF)
        {
            cout << c;
        }
        fclose(f);

        cout << "\n\n";
    }
    while( FindNextFile(hFind, &FindData) > 0 );

    if( GetLastError() != ERROR_NO_MORE_FILES )
    {
        cout << "Cos nie tak z wyszukiwaniem\n";
    }

    system("pause");
    return 0;
}

0

@spartanPAGE, @Azarien

drugi sposób: użycie ifstream

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

int main()
{
    ifstream textfile;
    string line;
    string path = "c:\\";
    string searchPattern = "*.txt";
    string fullSearchPath = path + searchPattern;

    WIN32_FIND_DATA FindData;
    HANDLE hFind;

    hFind = FindFirstFile( fullSearchPath.c_str(), &FindData );

    if( hFind == INVALID_HANDLE_VALUE )
    {
        cout << "Error searching directory\n";
        return -1;
    }

    do
    {
        string filePath = path + FindData.cFileName;
        cout << filePath << ": "<< "\n\n";

        textfile.open(filePath.c_str());
        if (textfile.is_open())
        {
            while ( getline (textfile, line) )
            {
                cout << line << '\n';
            }
            textfile.close();
        }

        else cout << "Unable to open file: " << filepath << endl;
        cout << "\n\n";
    }
    while( FindNextFile(hFind, &FindData) > 0 );
    FindClose(hFind);

    if( GetLastError() != ERROR_NO_MORE_FILES )
    {
        cout << "Something went wrong during searching\n";
    }

    system("pause");
    return 0;
}

I jeszcze to:
http://www.cplusplus.com/doc/tutorial/files/

0

Dla mnie to wyszlo, ze bez znajomosci STL to ja nic konkretnego nie napisze. Czy dobrze mysle?

1

Ja od siebie poleciłbym boost :)

Tu przykład z stackoverflow jak z tym się obchodzić http://stackoverflow.com/a/4283703
A wykrywanie wszystkich plików txt np możesz zrobić tak

namespace fs = boost::filesystem;
fs::path someDir("/path/to/somewhere");
fs::directory_iterator end_iter;


if ( fs::exists(someDir) && fs::is_directory(someDir))
{
  for( fs::directory_iterator dir_iter(someDir) ; dir_iter != end_iter ; ++dir_iter)
  {
    if (fs::is_regular_file(dir_iter->status()) && dir_iter->path().extension() == "txt" )
    {
      //rob cos
    }
  }
} 
0

spróbuj coś takiego::



                string katalog3;
		const char * c = katalog3.c_str();
		_finddata_t danePliku;
		long uchwyt = _findfirst(c, &danePliku);
		if (uchwyt == -1)
		{
			cout << "Podany katalog nie istnieje!" << endl;
			return 0;
		}

		for (int i = 0; !i; i = _findnext(uchwyt, &danePliku))
		{
			nazwa = string(danePliku.name); // aktualna nazwa piku
			plik.open(katalog3 + nazwa, ios::in);
                        // zrob cos
		        plik.close();
		}

0

spróbuj coś takiego::



                string katalog3;
		const char * c = katalog3.c_str();
		_finddata_t danePliku;
		long uchwyt = _findfirst(c, &danePliku);
		if (uchwyt == -1)
		{
			cout << "Podany katalog nie istnieje!" << endl;
			return 0;
		}

		for (int i = 0; !i; i = _findnext(uchwyt, &danePliku))
		{
			nazwa = string(danePliku.name); // aktualna nazwa piku
			plik.open(katalog3 + nazwa, ios::in);
                        // zrob cos
		        plik.close();
		}

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