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

时间:2018-06-27 14:19:26

标签: c++ ofstream

我已经编写了此代码,该代码将获取存储库并在其中查找文件。它旨在为找到的每个文件创建二进制文件,以便稍后在其中写入一些数据。但是,该代码未按预期运行。和二进制文件没有创建这个问题。

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

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 :(得分:2)

首先,我要说的是,如果您要查找的目录不存在或为空,则该程序将被锁定,如果制作更大的程序,则可以将其修复。

然后,对于您的情况,我看不到该字符串流的含义,因此我尝试删除该字符串流,并用普通字符串对其进行更改,并删除了从读取文件名得到的最后一个\ n字符:

        cout << fileName << '\n';

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

希望有帮助

答案 1 :(得分:1)

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

问题出在“换行符”中,字符串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;
}