Проблема перетаскивания Windows с консольным приложением - PullRequest
4 голосов
/ 25 января 2010

У меня есть программа, которая создает файл и записывает в него, используя ofstream. Мне нужно, чтобы программа могла потом анализировать параметры командной строки. Но по какой-то причине он не создает файл, когда я перетаскиваю файл на скомпилированный исполняемый файл, даже если программа вообще не использует никаких параметров командной строки. Если исполняемый файл работает нормально, он работает. Так что я остался в замешательстве. Вот источник:

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

У кого-нибудь есть идеи? Я ценю любую помощь.

Ответы [ 4 ]

1 голос
/ 25 января 2010

Следующий код выполняет то, что хочет OP:

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

Позволяет перетаскивать, но не использует имя удаленного файла в открытом файле. Когда вы помещаете в него файл, вы получаете сообщение

"написал файл"

К сожалению, на данный момент я не знаю , где он записал файл - определенно не в текущем каталоге. Просто собираюсь сделать поиск ...

Редактировать: Он создается в вашем каталоге Documents and Settings . Таким образом, чтобы поместить его в текущий каталог, вам, вероятно, нужно явно поставить перед ним префикс «./», но я не проверял это - я оставляю это в качестве упражнения для читателя: -)

1 голос
/ 25 января 2010

Вы вообще не используете аргументы командной строки. Перекодируйте ваш метод main (), чтобы он выглядел так:

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

Будьте осторожны с тем, что вы отбрасываете, ваш код перезаписывает содержимое файла.

0 голосов
/ 25 января 2010

Поскольку вы не указали путь, файл test.txt будет сохранен в пути по умолчанию. Просто вызовите командную строку (т.е. запустите cmd.exe), и в командной строке будет показан путь по умолчанию. Файл должен находиться в этом каталоге.

Вы можете изменить путь по умолчанию, отредактировав переменные окружения HOMEDRIVE & HOMEPATH.

Кроме того, вы должны отметить другие ответы. Вы должны использовать argc / argv для указания выходного файла.

0 голосов
/ 25 января 2010

вы не указали путь для "test.txt", поэтому он попытается создать этот файл в текущем рабочем каталоге исполняемого файла. Это будет отличаться, когда exe-файл вызывается путем перетаскивания файла на него, чем при обычном запуске программы.

Попробуйте указать полный путь к "test.txt" и посмотрите, работает ли он.

редактировать: Чтобы записать выходной файл в путь, содержащий exe-файл, вы должны использовать

GetModuleFileName(NULL, ...) на полный путь к exe, затем PathRemoveFileSpec чтобы удалить имя exe, оставив только путь exe PathCombine для добавления test.txt к пути exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...