проблема при создании бинарных файлов - PullRequest
0 голосов
/ 27 июня 2018

Я написал этот код, который он получает в хранилище и ищет файлы внутри. он нацелен на создание двоичных файлов для каждого найденного файла, чтобы потом записать в него некоторые данные. Однако код работает не так, как ожидалось. и бинарный файл не создан в этом вопросе.

В каталоге есть два изображения, и я получаю следующий вывод:

Creating bin files
C:\repo\1.bin

Error: failed to create file
Press <RETURN> to close this window... 

Я действительно не знаю, где мне это не хватает. Любой совет, я был бы рад.

#include <vector>
#include <string>
#include <iostream> // for standard I/O
#include <string>   // for strings
#include <iomanip>  // for controlling float print precision
#include <sstream>  // string to number conversion
#include <fstream>

using namespace std;

void getDir(string d, vector<string> & f)
{
    FILE* pipe =  NULL;
    string pCmd = "dir /B /S " + string(d);
    char buf[256];

    if( NULL == (pipe = _popen(pCmd.c_str(),"rt")))
    {
        cout<<"Error"<<endl;
        return;
    }

    while (!feof(pipe))
    {
        if(fgets(buf,256,pipe) != NULL)
        {
            f.push_back(string(buf));
        }

    }

    _pclose(pipe);
}

void replaceExt(string& s, const string& newExt) {

   string::size_type i = s.rfind('.', s.length());

   if (i != string::npos) {
      s.replace(i+1, newExt.length(), newExt);
   }
}

using namespace std;

int main(int argc, char* argv[])
{
    vector<string> files;
    string path = "C:\\repo";
    getDir(path, files);
    vector<string>::const_iterator it = files.begin();
    cout<<"Creating bin files "<<endl;

    ofstream myOfstream;

    while( it != files.end())
    {
        string fileName = (string) *it;
        replaceExt(fileName, "bin");
        cout << fileName << '\n';

        std::stringstream ss;
        ss << fileName << "" ;
        myOfstream.open(ss.str(),  fstream::binary);
        if ( !myOfstream )
        {
            std::cerr << "Error: failed to create file " << '\n';
            break;
        }

        myOfstream.close();

        it++;
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я нашел проблему, братан, после отладки; D

проблема в "новой строке", строка fileName имеет в конце "\ n", что и вызывает вашу ошибку. Таким образом, вы должны стереть это, я использовал это утверждение fileName.erase(std::remove(fileName.begin(), fileName.end(), '\n'), fileName.end()); и я включил алгоритм lib. рабочий код выглядит следующим образом:

#include <vector>
#include <string>
#include <iostream> // for standard I/O
#include <string>   // for strings
#include <iomanip>  // for controlling float print precision
#include <sstream>  // string to number conversion
#include <fstream>
#include <algorithm>

using namespace std;

void getDir(string d, vector<string> & f)
{
    FILE* pipe =  NULL;
    string pCmd = "dir /B /S " + string(d);
    char buf[256];

    if( NULL == (pipe = _popen(pCmd.c_str(),"rt")))
    {
        cout<<"Error"<<endl;
        return;
    }

    while (!feof(pipe))
    {
        if(fgets(buf,256,pipe) != NULL)
        {
            f.push_back(string(buf));
        }

    }

    _pclose(pipe);
}

void replaceExt(string& s, const string& newExt) {

   string::size_type i = s.rfind('.', s.length());

   if (i != string::npos) {
      s.replace(i+1, newExt.length(), newExt);
   }
}

using namespace std;

int main(int argc, char* argv[])
{
    vector<string> files;
    string path = "C:\\repo";
    getDir(path, files);
    vector<string>::const_iterator it = files.begin();
    cout<<"Creating bin files "<<endl;

    ofstream myOfstream;

    while( it != files.end())
    {
        string fileName = (string) *it;
        replaceExt(fileName, "bin");
        cout << fileName << '\n';
        fileName.erase(std::remove(fileName.begin(), fileName.end(), '\n'), fileName.end());
        std::stringstream ss;
        ss << fileName << "" ;
        myOfstream.open(ss.str(),  fstream::binary);
        if ( !myOfstream )
        {
            std::cerr << "Error: failed to create file " << '\n';
            break;
        }

        myOfstream.close();

        it++;
    }

    return 0;
}
0 голосов
/ 28 июня 2018

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

Тогда, для вашего случая, я не вижу точки этого потока строк, поэтому я попытался удалить ее и изменить на обычную строку, удалив последний символ \ n, полученный при чтении имен файлов:

        cout << fileName << '\n';

        string ss = fileName.substr(0, fileName.size() - 1);
        myOfstream.open(ss.c_str(), fstream::binary);
        if (!myOfstream)
        {

надеюсь, это поможет

...