更新:以下の問題を回避するために、私はやった
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
最初の後に 58ReadLine
を取得します( 60 から編集) ので、2 行目を読み取ろうとするとposition
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);
}
編集。コメントのデバッグの提案に従って、次のコードを追加しました
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);