windows, c ++: отправить файл в exe (решение c ++) и прочитать данные из отправленного файла

Моя цель - отправить произвольный текстовый файл в exe, который является сборкой проекта C ++. В проекте c ++ я хотел бы прочитать файл, который был отправлен в exe. Следовательно, я думаю, мне нужно передать путь отправленного файла в приложение (exe).

Мой код на C ++ [работает!]:

#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
  std::string readLineFromInput;

  ifstream readFile("input.txt"); // This is explizit. 
                                  // What I need is a dependency of passed path.
  getline(readFile, readLineFromInput);

  ofstream newFile;
  newFile.open("output.txt");
  newFile << readLineFromInput << "\n";

  newFile.close();
  readFile.close();
}

Моя конфигурация Windows:

По следующему пути я создал ярлык для exe (сборка проекта c ++): C: \ Users {User} \ AppData \ Roaming \ Microsoft \ Windows \ SendTo

Вопрос:

Я хочу щелкнуть правой кнопкой мыши произвольный текстовый файл и передать его (SendTo) в exe. Как я могу передать путь отправленного файла в качестве аргумента приложению, чтобы приложение могло прочитать отправленный файл?

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

ifstream readFile(argv[1]); 

Большое спасибо!

Дэйвид


person david-    schedule 25.03.2016    source источник
comment
SendTo уже делает именно это. Вы его тестировали, и у вас возникли проблемы?   -  person smead    schedule 25.03.2016
comment
Я не тестировал его, потому что argv [1] показался мне слишком странным. Как объяснил Реми Лебо, мне нужно выполнить некоторую обработку строк, чтобы получить интерпретируемый путь к исходному файлу. Итак, ifstream readFile(argv[1]); делает именно то, что я хочу. Далее следует понять его содержимое и выполнить некоторую обработку строк. Спасибо.   -  person david-    schedule 25.03.2016


Ответы (1)


Независимо от того, используете ли вы SendTo или OpenWith, имя файла, по которому щелкнули мышью, будет передано вашему исполняемому файлу в качестве параметра командной строки. Таким образом, массив argv[] будет содержать имя файла (в argv[1], если ваш ярлык SendTo не указывает дополнительные параметры командной строки, и в этом случае вам придется соответствующим образом настроить индекс argv[]).

Я только что сделал тест с SendTo, и argv[1] работает нормально. Просто убедитесь, что вы отметили argc, прежде чем открывать имя файла, например:

int _tmain(int argc, _TCHAR* argv[])
{
  if (argc > 1)
  {
    std::string readLineFromInput;

    std::ifstream readFile(argv[1]);
    if (readFile)
      std::getline(readFile, readLineFromInput);

    std::ofstream newFile(_T("output.txt"));
    if (newFile)
        newFile << readLineFromInput << "\n";
  }
}
person Remy Lebeau    schedule 25.03.2016
comment
Да ты прав. Оно работает! Как я могу записать output.txt в тот же каталог, где был прочитан input.txt? В моем случае выходной каталог находится там, где находится exe. Я попытался напечатать argv [1], но похоже, что это идентификатор, а не полный путь (c: \ foo \ input.txt) к исходному файлу. - person david-; 25.03.2016
comment
Проверить снова. Значение argv[] будет содержать полный путь и имя файла входного файла. Вам нужно будет написать код для анализа значения, чтобы отделить путь от имени файла, затем вы можете добавить желаемое выходное имя файла к извлеченному пути. Это базовая обработка строк 101 типа вещей, вы сможете поискать и найти множество руководств / примеров, которые помогут вам. Если вы все еще не можете разобраться, задайте новый вопрос. На этот вопрос был дан ответ, как и задано. - person Remy Lebeau; 25.03.2016
comment
Или просто используйте boost::filesystem::path::parent_path. - person MSalters; 25.03.2016
comment
Хорошо, попробую. Большое спасибо! - person david-; 25.03.2016