gpt4 book ai didi

c++ - `fgetpos` 没有返回正确的位置

转载 作者:行者123 更新时间:2023-11-28 06:48:15 25 4
gpt4 key购买 nike

更新:为了解决下面的问题,我已经完成了

if (ftell(m_pFile) != m_strLine.size())
fseek(m_pFile, m_strLine.size(), SEEK_SET);
fpos_t position;
fgetpos(m_pFile, &position);

这会为我的文件返回正确的位置。不过,我还是想明白为什么会这样?


我想获取文本文件中的位置。对于大多数文件,我一直在读取第一行,存储位置,做一些其他的事情然后返回到位置...

m_pFile = Utils::OpenFile(m_strBaseDir + "\\" + Source + "\\" + m_strFile, "r");
m_strLine = Utils::ReadLine(m_pFile);
bEOF = feof(m_pFile) != 0;
if (bEOF)
{
Utils::CompilerError(m_ErrorCallback,
(boost::format("File '%1%' is empty.") % m_strFile).str());
return false;
}

// Open.
pFileCode = Utils::OpenFile(strGenCode + "\\" + m_strFile, options.c_str());
m_strLine = Utils::Trim(m_strLine);
Utils::WriteLine(pFileCode, m_strLine);

// Store location and start passes.
unsigned int nLineCount = 1;
fpos_t position;
fgetpos(m_pFile, &position);
m_strLine = Utils::ReadLine(m_pFile);
...
fsetpos(m_pFile, &position);
m_strLine = Utils::ReadLine(m_pFile);

对于提供给我的所有文件,fgetposfsetpos 的存储工作正常。问题是我创建的文件看起来像

EG

这与提供的文件几乎相同。问题是对于上面的文件 fgetpos(m_pFile, &position); 没有返回正确的 position (我知道 fpos_t position是特定于实现的)。在第一个 ReadLine 之后,我得到一个 position 58(从 60 编辑),这样当我尝试用

fsetpos(m_pFile, &position);
m_strLine = Utils::ReadLine(m_pFile);

我明白了

on 700

代替

Selection: Function ADJEXCL

为什么 fgetpos 没有返回第一行结尾的位置?


_注意。 Utils.ReadLine 方法是:

std::string Utils::ReadLine(FILE* file)
{
if (file == NULL)
return NULL;
char buffer[MAX_READLINE];
if (fgets(buffer, MAX_READLINE, file) != NULL)
{
if (buffer != NULL)
{
std::string str(buffer);
Utils::TrimNewLineChar(str);
return str;
}
}
std::string str(buffer);
str.clear();
return str;
}

void Utils::TrimNewLineChar(std::string& s)
{
if (!s.empty() && s[s.length() - 1] == '\n')
s.erase(s.length() - 1);
}

编辑。按照评论中的调试建议,我添加了以下代码

m_pFile = Utils::OpenFile(m_strBaseDir + "\\" + Source + "\\" + m_strFile, "r");
m_strLine = Utils::ReadLine(m_pFile);
// Here m-strLine = " Logic Definition Report Chart Version: New Version 700" (64 chars).
long vv = ftell(m_pFile); // Here vv = 58!?

fpos_t pos;
vv = ftell(m_pFile);
fgetpos(m_pFile, &pos); // pos = 58.
fsetpos(m_pFile, &pos);
m_strLine = Utils::ReadLine(m_pFile);

最佳答案

抱歉,您的 Utils 函数显然是由无能者编写的。有些问题只是风格问题。修剪:

void Utils::TrimNewLineChar(std::string& s)
{
if (!s.empty() && *s.rbegin() == '\n')
s.resize(s.size() - 1); // resize, not erase
}

或者在 C++11 中

void Utils::TrimNewLineChar(std::string& s)
{
if (!s.empty() && s.back() == '\n')
s.pop_back();
}

ReadLine 更糟,将其替换为:

std::string Utils::ReadLine(FILE* file)
{
std::string str;
char buffer[MAX_READLINE];
if (file != NULL && fgets(buffer, MAX_READLINE, file) != NULL)
{
// it is guaranteed that buffer != NULL, since it is an automatic array
str.assign(buffer);
Utils::TrimNewLineChar(str);
}
// copying buffer into str is useless here
return str;
}

原文中的最后一个 str(buffer) 让我特别担心。如果 fgets 到达换行符、填充缓冲区或到达文件末尾,您可以保证在缓冲区中获得正确终止的字符串。如果发生其他 I/O 错误?谁知道?这可能是未定义的行为。

fgets 失败时,最好不要依赖 buffer 的值。

关于c++ - `fgetpos` 没有返回正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530092/

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