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?
0
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
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();
}