创建二进制文件时出现问题

issue while creating binary files

我写了这段代码,它获取存储库并在其中查找文件。它旨在为找到的每个文件创建二进制文件,以便稍后在其中写入一些数据。但是,代码并不像预期的那样 运行。并且二进制文件没有创建这个问题。

该目录有两张图片,我得到的输出如下:

Creating bin files
C:\repo.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;
}

首先我不得不说,如果你正在寻找的目录不存在或为空,程序就会被锁定,如果制作更大的程序,最好修复它。

然后,对于你的情况,我看不到那个字符串流的意义所在,所以我尝试删除它,并用普通字符串更改它,删除你从读取文件名中得到的最后一个 \n 字符:

        cout << fileName << '\n';

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

希望对您有所帮助

兄弟,调试后我发现了问题 ;D

问题出在 "newline",字符串 fileName 的末尾有一个“\n”,这就是您的错误所在。所以你必须擦掉它,我用过这个语句fileName.erase(std::remove(fileName.begin(), fileName.end(), '\n'), fileName.end()); 我包括算法库。 工作代码如下:

#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;
}