开发者

Windows drag and drop problem with console app

开发者 https://www.devze.com 2022-12-18 10:42 出处:网络
I have a program 开发者_高级运维that creates a file and writes to it using ofstream. I need the program to be able to parse command line parameters later on. But for some reason, it does not create a

I have a program 开发者_高级运维that creates a file and writes to it using ofstream. I need the program to be able to parse command line parameters later on. But for some reason, it does not create a file when I drag-and-drop a file onto the compiled executable, even if the program doesn't involve any command line parameters at all. If the executable is run normally, it works. So I'm left totally confused. Here is the source:

#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    ofstream outfile;
    outfile.open("test.txt");

    if(outfile.is_open())
    {
        outfile << "Test";
        outfile.close();
    }
    else cout << "Unable to open file";

    return 0;
}

Does anybody have any ideas? I appreciate any help.


You are not using the command line arguments at all. Recode your main() method to look like this:

int main(int argc, char** argv)
{
  if (argc != 2) 
  {
    cout << "Usage: blah.exe file" << endl;
    return 1;
  }
  ofstream outfile;
  outfile.open(argv[1]);
  if(outfile.is_open())
  {
    outfile << "Test";
    outfile.close();
  }
  else cout << "Unable to open file";
  return 0;
}

Be careful what you drop, your code rewrites the file contents.


The following code does what the OP wants:

#include <iostream>
#include <fstream>
using namespace std;

int main ( int argc, char ** argv )
{
    cout << argv[1] << endl;
    ofstream outfile;
    outfile.open("testzzzzzzz.txt");

    if(outfile.is_open())
    {
        outfile << "Testzzzzz";
        outfile.close();
        cout << "wrote file"<< endl;
    }
    else cout << "Unable to open file";

    string s;
    getline( cin, s );
    return 0;
}

It allows drag and drop, but doesn't use the dropped file name in the file open. When you drop a file in it, you get the message

"wrote file"

Unfortunately, at the moment I have no idea where it wrote the file - not in the current directory, definitely. Just going to do a search...

Edit: It creates it in your Documents and Settings directory. So to put it in the current directory, you probably need to explicitly prefix it with "./", but I havent't tested this - I leave it as an exercise for the reader :-)


Since you have not specified a path, the file, test.txt, will be saved to the default path. Just bring up a command prompt (i.e. run cmd.exe) and the command prompt will show you the default path. The file should be in this directory.

You can change the default path by editing the HOMEDRIVE & HOMEPATH environment variables.

Also, you should note the other answers. You should be using argc/argv to specify the output file.


you haven't specified a path for "test.txt" so it will try and create that file in the current working directory of the executable. This will be different when the exe is invoked by dropping a file on it than it is when you run the program normally.

Try giving "test.txt" a full path and see if that works.

edit: To write your output file to the path that contains the exe, you would use

GetModuleFileName(NULL, ...) to the the full path of the exe, then PathRemoveFileSpec to strip off the exe name, leaving just the exe path then PathCombine to append test.txt to the exe path

0

精彩评论

暂无评论...
验证码 换一张
取 消