首页 > 解决方案 > 在 C++ 中构建文件路径

问题描述

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

标签: c++visual-c++

解决方案


TL;DR:这样做:

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

就是这样。

问题(不幸的是)与指针和隐式转换以及与 C 和运算符关联性以及 C++ 语言中的其他一些技术的向后兼容性有关。

你看,argv[1]不是一个“字符串”(即std::string),而仅仅是一个指向以 NUL 结尾的字符数组的指针。但是,将 应用于+左侧char *的 a 和std::string右侧的 a (即argv[1] + std::string("..."))是合法的,它会执行字符串连接,这就是您想要的。

但是然后你在它们之间放置一个字符(应该是 type char,但通常是一个int),它会改变对操作结果的评估+。现在你把三个东西加在一起了,第一个加法是先完成的,它在一个指针和一个整数之间,它的结果与字符串连接相去甚远。

正确的方法(嗯,一个正确的方法)是将该行 ( argv[1]) 上的第一件事变成std::string. 该类型std::string可以使用运算符将​​字符和指向以 NUL 结尾的字符数组的指针以及其他一些东西连接到自身+,并且这些操作的结果std::string再次都是 s,并且当同一表达式中有多个+运算符时,它们从左开始计算-向右...所以你会没事的!

还有一件事要记住:与其他一些语言相反,向 a 添加数字是std::string行不通的。您可以使用std::to_string(x)将数字转换为字符串。


推荐阅读