Путь к файлу сборки в c ++ - PullRequest
1 голос
/ 03 октября 2019

Я новичок в c ++ и хочу прочитать файл csv и распечатать количество строк.

Каталог файла передается в качестве аргумента командной строки, и дается имя файла. Следующая строка должна построить путь к CSV:

//argv[1] = C:\Users\me\source\repos\sol1\proj1\bin\x64\Debug\191003-070100\
string verpfad = argv[1] + std::string("veraenderungen.csv");

//verpfad shows as: C:\Users\me\source\repos\sol1\proj1\bin\x64\Debug\191003-070100 in the console

Затем я попытался поставить обратную косую черту перед именем файла и удалить его из аргумента командной строки:

//argv[1] = C:\Users\me\source\repos\sol1\proj1\bin\x64\Debug\191003-070100
string verpfad = argv[1] + std::string("\\veraenderungen.csv");
//verpfad shows as: C:\Users\me\source\repos\sol1\proj1\bin\x64\Debug\191003-070100 in the console

Далее я попробовал

//argv[1] = C:\Users\me\source\repos\sol1\proj1\bin\x64\Debug\191003-070100
string verpfad = argv[1] + '\\' + std::string("veraenderungen.csv");
//verpfad shows as: veraenderungen.csv in the console

Как я могу это исправить?

Для полноты всего кода:

#include "pch.h"
#include <iostream>

//meine includes
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    // this line 
    string verpfad = argv[1] + std::string("veraenderungen.csv");


    ifstream ver(verpfad);

    if (!ver.is_open()) std::cout << "Datei " << verpfad << "kann nicht geöffnet werden" << '\n';

    //Anzahl der Zeilen in der Datei
    std::count(std::istreambuf_iterator<char>(ver), std::istreambuf_iterator<char>(), '\n');

    ver.close();

    std::cout << "Pfad ist: ";
    std::cout << argv[1] <<  std::endl;

    system("pause");

    return 0;
}

1 Ответ

1 голос
/ 03 октября 2019

TL; DR: Сделайте это:

string verpfad = std::string(argv[1]) + '\\' + "veraenderungen.csv";

И это все.

Проблема (к сожалению) связана с указателями и неявным приведением и обратной совместимостью с C и ассоциативностью операторови некоторые другие технические особенности языка C ++.

Видите ли, argv[1] - это не"строка" (т. е. std::string), а просто указатель на NUL-концевой массивперсонажи. Тем не менее, применение + к char * слева и std::string справа (т. Е. argv[1] + std::string("...")) является законным, и оно выполняет конкатенацию строк , что вам и нужно. .

Но затем вы идете и помещаете между ними один символ (который должен быть типа char, но довольно часто это int), который изменяет оценку результата + операция. Теперь, когда вы добавляете три вещи вместе, сначала выполняется первое добавление, которое находится между указателем и целым числом, и его результат далек от конкатенации строк.

Правильный путь (ну, один правильный путь)это сделать первое, что в этой строке (argv[1]) в std::string. Тип std::string может объединять символы и указывать на NUL-концевые массивы символов и некоторые другие элементы для себя, используя оператор +, и в результате все эти операции снова std::string s, а также при наличии нескольких + операторов в том же выражении, которые они оценивают слева направо ... так что все будет в порядке!

Еще одна вещь, которую нужно помнить: в отличие от некоторых других языков, добавление чисел к std::string не будет работать. Вы можете использовать std::to_string(x), чтобы превратить числа в строки.

...