c++ - 在 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;
}
解决方案
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)
将数字转换为字符串。
推荐阅读
- python - 使用 win32api.ShellExecute 更改默认打印机参数
- java - 如何使用 2 个虚拟机在 java 中测试我的套接字程序?
- java - HTTP 状态 400 - 错误请求 - 休眠
- r - 如何有条件地选择时间序列
- android-studio - Android Studio 中的多行编辑
- mongodb - 有没有办法将 MongoEngine 中的 MongoDB _id 字段名称从 $oid 更改为 $id?
- python-3.x - 跨数字的随机几何分布
- c - 从 C 中的文件读取和写入
- php - Apple Pay 条纹集成
- javascript - 未捕获的 SyntaxError:严格模式代码可能不包含 with 语句