如果我想在Windows上进行以下工作,那么正确的语言环境是什么?如何检测它实际存在: 此代码是通用的,还是仅仅是我的系统?
出于某些原因,我需要在文件名(C语言)中编写具有中文字符的文件.例如:
#include<stdio.h>
#include<stdlib.h>
FILE *fout;
int main(){
fout = fopen("???.txt", "w");
fprintf(fout, "Jobs");
//Do something...
}
Run Code Online (Sandbox Code Playgroud)
没有错误,但是没有创建文件.我想知道如何解决这个问题.谢谢!
操作系统是Windows 8.1,但可以接受Linux解决方案.
当文件名是"Unicode"文件名时,我需要打开一个文件作为std :: fstream(或实际上任何其他std :: ostream).
在MSVC下我有非标准的扩展名std::fstream::open(wchar_t const *,...)?我可以用其他编译器做什么,比如GCC(最重要的)和Borland编译器.
我知道CRTL提供_wfopen但是它提供了C FILE *接口而不是io-stream,也许有一种非标准的方法来创建io-stream FILE *?有没有boost::ifstream像MSVC一样的Windows扩展?
考虑在 Linux 系统上运行的这段代码(编译器资源管理器链接):
#include <filesystem>
#include <cstdio>
int main()
{
try
{
const char8_t bad_path[] = {0xf0, u8'a', 0}; // invalid utf-8, 0xf0 expects continuation bytes
std::filesystem::path p(bad_path);
for (auto c : p.u8string())
{
printf("%X ", static_cast<uint8_t>(c));
}
}
catch (const std::exception& e)
{
printf("error: %s\n", e.what());
}
}
Run Code Online (Sandbox Code Playgroud)
它故意std::filesystem::path使用具有不正确的 UTF-8 编码的字符串构造一个对象(0xf0 开始一个 4 字节字符,但'a'不是连续字节;更多信息请参见此处)。
调用时u8string,不抛出异常;我发现这令人惊讶,因为cppreference 的文档指出:
- u8string() 的结果编码始终为 UTF-8。
检查LLVM 的 libcxx 的实现,我发现确实没有执行验证 - 内部保存的字符串 …
使用cstdio,覆盖文件的最安全方法是什么?在这种情况下,“安全”意味着文件不可能不完整或损坏;该文件将被完全覆盖,或者如果出现问题,它将是旧文件。
我想最好的方法是创建一个临时中间文件,然后在该中间文件完成后覆盖旧文件。如果这实际上是最好的方法,那么还有一些其他问题似乎是可能的,尽管很少见。
我想这有一个很好的做法,但我找不到它。这是用于保存的游戏数据;只有一个文件,而且每次都会覆盖整个文件,无需担心部分覆盖或附加。