簡體   English   中英

seekg()無法按預期工作

[英]seekg() not working as expected

我有一個小程序,旨在從文件中復制一個小詞組,但似乎我對seekg()的工作方式不了解 ,或者我的代碼中存在一個問題,導致該函數無法按預期工作。

文本文件包含:

//介紹

previousNoted = false

該代碼旨在將單詞“ false”復制到字符串中

std::fstream stats("text.txt", std::ios::out | std::ios::in);
//String that will hold the contents of the file
std::string statsStr = "";
//Integer to hold the index of the phrase we want to extract
int index = 0;

//COPY CONTENTS OF FILE TO STRING
while (!stats.eof())
{
    static std::string tempString;
    stats >> tempString;
    statsStr += tempString + " ";
}

//FIND AND COPY PHRASE
index = statsStr.find("previouslyNoted=");     //index is equal to 8
//Place the get pointer where "false" is expected to be
stats.seekg(index + strlen("previouslyNoted="));     //get pointer is placed at 24th index
//Copy phrase
stats >> previouslyNotedStr;

//Output phrase
std::cout << previouslyNotedStr << std::endl;

但是無論出於何種原因,程序都會輸出:

=假

我期望發生的事情:

我相信我將get指針放置在文件的第24個索引處,這是短語“ false”開始的地方。 然后,程序將從該索引開始輸入,直到遇到空格字符或遇到文件末尾為止。

實際發生了什么:

無論出於何種原因,get指針都會在預期之前啟動索引。 我不確定為什么。 關於出什么問題/我在做什么錯的解釋將不勝感激。

另外,我確實知道我可以簡單地從我希望的位置開始,使previousNotedStr成為statsStr的子字符串,並且我已經成功地嘗試過了。 我真的只是在這里做實驗。

VisualC ++標記表示您在Windows上。 在Windows上,行尾使用兩個字符(\\ r \\ n)。 一次讀取一個字符串中的文件時,該行尾序列被視為定界符,並用單個空格字符替換它。

因此,在讀取文件后,statsStr與文件內容不匹配。 在文件中的每一個新行中,您都用一個字符替換了兩個字符。 因此,當您使用seekg根據從statsStr字符串獲得的數字將自己放置在文件中時,您最終將放在錯誤的位置。

即使正確的換行處理,如果文件包含兩個或多個連續的空格字符,仍然會遇到問題,因為這些字符會在您的讀取循環中折疊為一個空格字符。

您正在逐字讀取文件。 有更好的方法:

while (getline(stats, statsSTr)
{
  // An entire line is read into statsStr.
  std::string::size_type posn = statsStr.find("previouslyNoted=");
  // ...
}

通過將整個文本行讀取為字符串,無需重新定位文件。

此外,按字閱讀時還會出現空格問題。 這將影響認為文本在文件中的位置。 例如,跳過了空白,並且沒有告訴您跳過了多少空格,換行符或制表符。

順便說一句,甚至不要考慮替換同一文件中的文本。 僅當替換文本的長度與文件中原始文本的長度相同時,文本替換才有效。 改為寫入新文件。

編輯1:
更好的方法是將您的字符串聲明為數組。 這有助於將指針定位在字符串中:

static const char key_text[] = "previouslyNoted=";
while (getline(stats, statsStr))
{
  std::string::size_type key_position = statsStr.find(key_text);
  std::string::size_type value_position = key_position + sizeof(key_text) - 1; // for the nul terminator.
  // value_position points to the character after the '='.
  // ...
}

您可能希望通過使數據文件符合現有格式(例如INI或XML)並使用適當的庫來解析它們來保存編程類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM