Как извлечь пути из файла? - PullRequest
0 голосов
/ 04 апреля 2011

Мне нужно прочитать файл, который содержит пути других файлов, типы и другие данные о них. Файл выглядит так,

LIST OF SUB DIRECTORIES:
Advanced System Optimizer 3
ashar wedding and home pics
components
Documents and Settings
khurram bhai
media
new songs
Office10
Osama
Program Files
RECYCLER
res
Stationery
System Volume Information
Templates
WINDOWS



LIST OF FILES:
.docx  74421
b.com  135168
ChromeSetup.exe  567648
Full & final.CPP  25884
hgfhfh.jpg  8837
hiberfil.sys  267964416
myfile.txt.txt  0
pagefile.sys  402653184
Shortcut to 3? Floppy (A).lnk  129
Thumbs.db  9216
vcsetup.exe  2728440
wlsetup-web.exe  1247056

Мне нужно извлечь только пути к файлам и сохранить их в массиве, но я застрял с этим. Вот мой код,

// read a file into memory
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  int length;
  char str[600];

  ifstream is;
  is.open ("test.txt", ios::binary );

  // get length of file:
  is.seekg (0, ios::end);
  length = is.tellg();
  is.seekg (0, ios::beg);


  // read data as a block:
  is.read (str,length);
  //**find the path of txt files in the file and save it in an array...Stuck here**
  is.close();
  return 0;
}

Я не понимаю, что делать дальше. Даже если я использую strstr (), чтобы найти .txt, когда бы он ни поступил, как бы мне получить весь путь?

Ответы [ 4 ]

4 голосов
/ 04 апреля 2011

Может быть, вам стоит взглянуть на библиотеку файловой системы boost .

Он предоставляет то, что вам нужно.

Это должен быть пример того, как это может работать. Должен скомпилироваться, хотя я не пробовал.

boost::filesystem::path p("test.txt");
boost::filesystem::path absolutePath = boost::filesystem::system_complete(p);
boost::filesystem::path workDir = absolutePath.parent_path();

std::vector<std::string> file;
std::string line;
std::ifstream infile ("test.txt", std::ios_base::in);
while (getline(infile, line, '\n'))
{
    file.push_back (line.substr(0, line.find_first_of(" ")));
}

std::vector<std::wstring> fullFileNames;
for(std::vector<std::string>::const_iterator iter = file.begin(); iter != file.end(); ++iter)
{
    boost::filesystem::path newpath= workDir / boost::filesystem::path(*iter);
    if(!boost::filesystem::is_directory(newpath) && boost::filesystem::exists(newpath))
    {
        fullFileNames.push_back(newpath.native().c_str());
    }
}

И, конечно, в нем отсутствуют все виды проверок на ошибки.

1 голос
/ 04 апреля 2011

Если вам нужно только извлечь путь, и файл будет всегда выглядеть так, вы можете читать файл построчно и использовать string::find, чтобы найти первое вхождение пробела и создать подстрока каждой записи.

size_t index = str.find(" ");
if(index != string::npos) // sanity checing
{
   string path = str.substr(0, index);
   //do whatever you want to do with the file path
}
0 голосов
/ 04 апреля 2011

Если вы хотите получить полный путь к указанному файлу, который находится в текущем каталоге, следующий код сделает это за вас, используя повышение курса:

#include <iostream>

#define BOOST_FILESYSTEM_VERSION 3
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

int main()
{
  fs::path my_path("test.txt");
  if(fs::is_regular_file(my_path)) // Sanity check: the file exists and is a file (not a directory)
  {
    fs::path wholePath = fs::absolute(my_path);
    std::cout << wholePath.string() << std::endl;
  }

  return 0;
}
0 голосов
/ 04 апреля 2011

То, что вы хотите выполнить, это на самом деле пример кода, демонстрирующий, как использовать string::find_last_of на cplusplus.com :

void SplitFilename (const string& str)
{
  size_t found;
  cout << "Splitting: " << str << endl;
  found=str.find_last_of("/\\");
  cout << " folder: " << str.substr(0,found) << endl;
  cout << " file: " << str.substr(found+1) << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...