問題

我是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++