使用 x86_64-w64-mingw32-g++ 使用 fstream 检查文件是否存在以进行交叉编译
Check file existence with fstream using x86_64-w64-mingw32-g++ for cross compilation
我有一个用 C 和 C++ 编写的程序,我正在重写一些部分以改进它。该程序必须处理文件,但我无法使用交叉编译的 exe 检查 Windows 上是否存在文件。
为了检查我的代码是否有问题,我创建了这个简单的示例:
#include <fstream>
#include <iostream>
int main(){
std::fstream in_file("test.noexists", std::ios::in|std::ios::binary);
if (in_file) {
std::cout << "File exists" << std::endl;
}
else {
std::cout << "File doesn't exists" << std::endl;
}
}
在 Debian 10 上使用“x86_64-w64-mingw32-g++”版本 8.3-win32 编译此代码,我无法检查文件是否存在,因为它总是 returns“true”。为了验证它,我在 Linux 上使用 g++ 编译了相同的程序,在 Windows 上使用 mingw64 编译了相同的程序,并且两者都在工作所以看起来像在 Debian 10 mingw32 上构建项目的问题。
我不知道我的问题是 Debian 版本的错误还是我做错了什么。有人知道吗?
我看到两者之间的唯一区别是版本(Windows 上的 8.1 与 Debian 上的 8.3),当然还有 SO。
谢谢!
编辑:
我已经升级到具有 x86_64-w64-mingw32-g++ v10 和相同行为的 Debian 11。我忘了说我在 WSL 上使用的是 Debian 11,而不是真正的 Debian 发行版。我觉得不重要。
编辑2:
我已经看过建议的线程,但问题是我想使用流来管理文件,而该线程中的唯一选项也失败了。使用其他三种方法中的任何一种都会像黑客一样无济于事。我认为这不是用另一个示例检查文件存在的最佳方法,然后稍后重新打开文件以使用它。
假设 fstream class 具有布尔转换,正如我在多个线程中所读到的那样,这就是我使用此示例的原因。 Linux 版本完美运行,因此该功能按预期运行。问题是 Linux 中编译的 Windows 版本(交叉编译的 EXE)。
我测试了in_file.good()、in_file.is_open()、in_file.bad(),只是in_file...他们都returns喜欢该文件已正确打开。我也试过 ifstream,但行为相同。
稍微休息一下总是有帮助的...我找到了解决我的问题的方法,只是读取 0 个字节。
#include <fstream>
#include <iostream>
int main(){
std::fstream in_file("test.noexists", std::ios::in|std::ios::binary);
char dummy;
if (in_file.read(&dummy, 0)) {
std::cout << "File exists " << in_file.tellg() << std::endl;
}
else {
std::cout << "File doesn't exists" << std::endl;
}
}
有了这个,即使是交叉编译的 EXE 也可以正常工作。
我还在想为什么只有交叉编译的 EXE 才会失败,但我找不到任何关于它的信息以及如何修复它。至少这个解决方案是有效的。
此致。
我有一个用 C 和 C++ 编写的程序,我正在重写一些部分以改进它。该程序必须处理文件,但我无法使用交叉编译的 exe 检查 Windows 上是否存在文件。
为了检查我的代码是否有问题,我创建了这个简单的示例:
#include <fstream>
#include <iostream>
int main(){
std::fstream in_file("test.noexists", std::ios::in|std::ios::binary);
if (in_file) {
std::cout << "File exists" << std::endl;
}
else {
std::cout << "File doesn't exists" << std::endl;
}
}
在 Debian 10 上使用“x86_64-w64-mingw32-g++”版本 8.3-win32 编译此代码,我无法检查文件是否存在,因为它总是 returns“true”。为了验证它,我在 Linux 上使用 g++ 编译了相同的程序,在 Windows 上使用 mingw64 编译了相同的程序,并且两者都在工作所以看起来像在 Debian 10 mingw32 上构建项目的问题。
我不知道我的问题是 Debian 版本的错误还是我做错了什么。有人知道吗?
我看到两者之间的唯一区别是版本(Windows 上的 8.1 与 Debian 上的 8.3),当然还有 SO。
谢谢!
编辑:
我已经升级到具有 x86_64-w64-mingw32-g++ v10 和相同行为的 Debian 11。我忘了说我在 WSL 上使用的是 Debian 11,而不是真正的 Debian 发行版。我觉得不重要。
编辑2:
我已经看过建议的线程,但问题是我想使用流来管理文件,而该线程中的唯一选项也失败了。使用其他三种方法中的任何一种都会像黑客一样无济于事。我认为这不是用另一个示例检查文件存在的最佳方法,然后稍后重新打开文件以使用它。
假设 fstream class 具有布尔转换,正如我在多个线程中所读到的那样,这就是我使用此示例的原因。 Linux 版本完美运行,因此该功能按预期运行。问题是 Linux 中编译的 Windows 版本(交叉编译的 EXE)。
我测试了in_file.good()、in_file.is_open()、in_file.bad(),只是in_file...他们都returns喜欢该文件已正确打开。我也试过 ifstream,但行为相同。
稍微休息一下总是有帮助的...我找到了解决我的问题的方法,只是读取 0 个字节。
#include <fstream>
#include <iostream>
int main(){
std::fstream in_file("test.noexists", std::ios::in|std::ios::binary);
char dummy;
if (in_file.read(&dummy, 0)) {
std::cout << "File exists " << in_file.tellg() << std::endl;
}
else {
std::cout << "File doesn't exists" << std::endl;
}
}
有了这个,即使是交叉编译的 EXE 也可以正常工作。
我还在想为什么只有交叉编译的 EXE 才会失败,但我找不到任何关于它的信息以及如何修复它。至少这个解决方案是有效的。
此致。