问题

我是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" << '
';

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

    ver.close();

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

    system("pause");

    return 0;
}
 

  最佳答案

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,当同一个表达式中有多个+时,它们从left-toright -..所以你会很好!

还有一件事要记住:与其他一些语言相反,将数字添加到std::string不起作用.您可以使用std::to_string(x)将数字转换为字符串.

  相同标签的其他问题

c++visual-c++