【发布时间】:2014-07-02 11:36:01
【问题描述】:
更新:为了解决以下问题,我已经完成了
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);
使用提供给我的所有文件,fgetpos 和 fsetpos 的存储工作正常。问题在于我创建的文件看起来像
这与提供的文件几乎相同。问题是fgetpos(m_pFile, &position); 上面的文件没有返回正确的position(我知道fpos_t position 是特定于实现的)。在第一个 ReadLine 之后,我得到一个 58 的 position(从 60 编辑),所以当我尝试用
fsetpos(m_pFile, &position);
m_strLine = Utils::ReadLine(m_pFile);
我明白了
700
而不是
选择:函数 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);
}
编辑。根据 cmets 中的调试建议,我添加了以下代码
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);
【问题讨论】:
-
我认为“我创建的文件看起来像”和“几乎相同”之间有点缺失。也就是说,在 Windows 上,当您在文本模式下阅读时需要注意换行符转换,这可能是您的问题。
-
谢谢你,我已经编辑了这个问题。文本文件是使用 C# 创建的,并使用默认编码 (
Encoding.Default) 来编写文本文件。使用的行尾是\r\n,并且似乎对于有效的文件显示完全相同。我不知道为什么这个(我创建的文件)是 40 个中唯一一个无法使用上述代码返回正确位置的文件!?马车返回和换行符看起来不错!? -
This question 可能是相关的(但不确定是否是骗局)。
-
你可以尝试调用 fgetpos() 并立即调用 fsetpos() 和 ReadLine() 吗?如果这项工作必须在该职位之间的工作中。
-
另外,使用 ftell() 调试