gpt4 book ai didi

c++ - 有没有一种符合标准的方法来用 C++ 编写可移植的 ls 实用程序?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:27 25 4
gpt4 key购买 nike

让我们考虑以下代码,列出作为程序第一个参数给出的路径的目录内容:

#include <filesystem>
#include <iostream>

int main(int argc, char **argv)
{

if(argc != 2)
std::cerr << "Please specify a directory.\n";

for(auto& p: std::filesystem::directory_iterator(argv[1]))
std::cout << p << '\n';

}

乍一看这似乎非常精简、可移植并且符合 C++ 标准(请忽略如果目录不存在它不会捕获异常)。

但是,似乎存在一些陷阱。特别是,C++ 标准似乎没有强制要求 argv[1] 的编码与 std::filesystem::path 构造函数接受的编码相匹配,它似乎也没有要求 std::filesystem::path::string() 返回的编码与 std::cout 接受的编码相匹配。

恰恰相反,该标准似乎引入了新术语“ native 编码”,它可能与执行字符集编码不同,定义为:

The native encoding of a narrow character string is the operating system dependent current encoding for pathnames ([fs.class.path]).

根据我对标准的阅读,如果 std::filesystem::path::value_typechar 匹配,则编码之间没有转换 argv[1] 的类型(在任何 POSIX 系统上都是如此)。

这似乎允许,例如,执行字符集编码(以及 argv[1] 的编码和 std::cout< 接受的编码)的一致实现) 是 EBCDIC,但文件系统库接受和提供的字符串编码是 ISO 8859-1,两者之间没有执行转换,使得文件系统库基本上无用。 更糟糕的是,无法确定这两种编码是否相同。

如果您开始编写删除文件的实用程序,并且 argv[1] 提供的要删除的文件在以文件系统库。

请注意,我不关心使用与程序使用的编码不同的编码的文件系统。我担心的是该标准似乎并未强制要求对这些编码进行任何转换。

u8path()u8string() 函数在这里也没有用,因为标准也没有提供在 UTF-8 和执行字符集之间转换的方法编码(由 argv[1]std::cout 使用)。

是否有任何可移植、编码不可知且符合标准的方法来执行此操作?

最佳答案

不,这不仅仅是理论上的。

在 Windows 系统上,路径是 UTF-16,path::value_typewchar_t,而不是您从 获得的 char >字符** argv。这本身不是问题 - path 可以从 char* 创建。但是,并非每个 Windows 文件名都可以表示为 char*。因此程序无法列出一些名称不能用char*表示的目录的内容。

现在您会认为 Linux 会更好。实际上并非完全如此 - 您为文件名获得的字节数可能取决于 whether you entered them on a keyboard or via TAB completion!

关于c++ - 有没有一种符合标准的方法来用 C++ 编写可移植的 ls 实用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com