【发布时间】:2020-08-27 00:36:02
【问题描述】:
我正在尝试使用 ifstream 打开一个 txt 文件并使用 ifstream 从该文件中读取数据,而该代码在 x86 位平台上运行良好,在 x64 位平台上使用它会导致奇怪的应用程序崩溃.
ifstream font;
font.open(filename);
if ( font.fail() )
{
return false;
}
// Used to read 95 ASCII characters in the text file
for ( int i = 0; i < 95; i++ )
{
font.get(temp);
while (temp != ' ')
{
font.get(temp);
}
font.get(temp);
while (temp != ' ')
{
font.get(temp);
}
font >> m_Font[i].left;
font >> m_Font[i].right;
font >> m_Font[i].size;
}
删除font.fail()检查会导致程序卡在font.get(temp);,这意味着font.fail()导致程序崩溃,如果有人知道这个问题的解决方案或者可以指出另一种阅读方式在这种情况下的文本文件,请告诉我。
可以在下面找到可重现的示例,请确保将构建配置设置为 x64 并将子系统设置为 Windows`
#include <Windows.h>
#include <iostream>
#include <fstream>
using namespace std;
struct TestStruct
{
int test;
}; TestStruct* testStruct;
bool Test(char* filename)
{
testStruct = new TestStruct[8];
if (!testStruct)
{
return false;
}
ifstream font;
font.open(filename);
if (font.fail())
{
return false;
}
char temp;
for ( int i = 0; i < 8; i++)
{
font.get(temp);
while (temp != ' ')
{
font.get(temp);
}
font.get(temp);
while (temp != ' ')
{
font.get(temp);
}
font >> testStruct[i].test;
}
font.close();
return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow)
{
AllocConsole();
freopen("CONOUT$", "w", stdout);
while ( Test((char*)"test.txt") )
{
}
return 0;
}
P.S 我在从构建文件夹执行二进制文件时无法重现此问题,但是在附加本地 Windows 调试器的情况下启动它时仍然会发生。
【问题讨论】:
-
font.fail真的crash,还是这个函数return false然后出现其他问题? -
请发帖minimal reproducible example。它应该编译并重现您的问题。
-
m_Font和temp是如何声明的? -
当您使用调试器运行程序时,您看到了什么?这正是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用它来一次运行您的程序、监控所有变量及其值的变化以及分析程序的逻辑执行流程的好机会。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
-
为什么不使用
bool Test(const char* filename)?像这样(char*)"test.txt")调用 UB