gpt4 book ai didi

c++ - 关于使用 ifstream 读取文件,为什么我的程序在 Windows 和 Linux 上产生不同的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:28 24 4
gpt4 key购买 nike

我有一个程序如下所示。对于它我有几个问题:

1). 为什么在不同的平台上会产生不同的结果?我稍后会贴上屏幕截图。

2). 我正在使用 fail() 方法来检查“file.read()”是否失败。这是正确的吗? 我使用 fail() 方法是因为 this web page是这样说的:

The function returns true if either the failbit or the badbit is set. At least one of these flags is set when some error other than reaching the End-Of-File occurs during an input operation.

但后来我阅读了有关 istream::read() here 的页面.它说 eofbit 和 failbit 总是同时设置。这是否意味着正常的 EOF 情况也会导致 fail() 返回 true?这似乎与“除了发生文件结束之外”冲突。

谁能帮我阐明我应该如何使用这些方法?我应该改用 bad() 吗?

我的程序

#include <iostream>
#include <fstream>
using namespace std;

#ifdef WIN32
char * path="C:\\Workspace\\test_file.txt";
#else
char * path="/home/robin/Desktop/temp/test_file.txt";
#endif

int main(int argc, char * argv[])
{
ifstream file;

file.open(path);
if (file.fail())
{
cout << "File open failed!" << endl;
return -1; // If the file open fails, quit!
}

// Calculate the total length of the file so I can allocate a buffer
file.seekg(0, std::ios::end);
size_t fileLen = file.tellg();
cout << "File length: " << fileLen << endl;
file.seekg(0, std::ios::beg);

// Now allocate the buffer
char * fileBuf = new (std::nothrow) char[fileLen+1];
if (NULL == fileBuf)
return -1;
::memset((void *)fileBuf, 0, fileLen+1); // Zero the buffer

// Read the file into the buffer
file.read(fileBuf, fileLen);
cout << "eof: " << file.eof() << endl
<< "fail: " << file.fail() << endl
<< "bad: " << file.bad() << endl;
if (file.fail())
{
cout << "File read failed!" << endl;
delete [] fileBuf;
return -1;
}

// Close the file
file.close();

// Release the buffer
delete [] fileBuf;

return 0;
}

test_file.txt 内容(用“vim -b”显示。这是一个非常简单的文件):

test_file.txt content

Windows 上的结果(Visual Studio 2008 SP1):

Windows result

Linux 上的结果(gcc 4.1.2):

Linux result

最佳答案

Does this mean that a normal EOF situation would also result in that fail() returns true? This seems to conflict with "other than reaching the End-Of-File occurs".

我建议使用没有错误的引用。

http://en.cppreference.com/w/cpp/io/basic_ios/fail说:

Returns true if an error has occurred on the associated stream. Specifically, returns true if badbit or failbit is set in rdstate().

C++ 标准说:

Returns: true if failbit or badbit is set in rdstate().

没有“除了文件结尾”的东西。试图读取文件末尾的操作也会导致 failbit 设置。 eofbit 仅用于将特定的失败原因与其他原因区分开来(这并不像人们最初想象的那么有用)。


I'm using a fail() method to check if the "file.read()" failed. Is this correct?

您应该简单地通过转换为 bool 进行测试。

if(file) { // file is not in an error state

它是 !fail() 的同义词,但它更有用,因为您可以使用它直接测试读取操作的结果而无需额外的括号(如 !(stream >> x).fail() 变得尴尬):

if(file.read(fileBuf, fileLen)) { // read succeeded

您会注意到流上的所有读取操作都会返回流本身,这就是您可以执行此操作的原因。


Why does it produce different results on different platforms?

您在 Windows 和 Linux 之间看到的差异是因为文件以文本模式打开:换行符将由实现静默转换。这意味着 "\r\n" 组合(在 Windows 中用于换行符)将在 Windows 中转换为单个 '\n' 字符,使文件具有只有8个字符。请注意 vim 如何在第一行的末尾显示 ^M:那是 '\r' 部分。在 Linux 中,换行符只是 '\n'

如果你想保留原始文件,你应该以二进制模式打开文件:

file.open(path, std::ios_base::in | std::ios_base::binary);

关于c++ - 关于使用 ifstream 读取文件,为什么我的程序在 Windows 和 Linux 上产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9817806/

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