2017-09-01 36 views
0

我一直在尋找一些時間,沒有一點希望。 基本上我想知道在程序退出後是否可以保存一個變量並在可執行文件中讀取它。是否可以在程序關閉後在內部保存變量並對其進行讀寫?

我知道可以使用fstream函數將變量存儲在外部文件中,但是我正在尋找一種像.exe一樣將其存儲在內部的方法。

string l; 
cin >> l; 
// function to save it internally..... 

在此先感謝o.o

+4

這可能在某些條件下,但我說這是一個壞主意,可能會阻止工作,具體取決於您的操作系統。在現代Windows上,如果沒有UAC標高,應用程序文件夾甚至不會寫入。而且防病毒軟件可能會檢測到更改.. – drescherjm

+2

你所描述的是一個自我修改的可執行文件。我記得有些MS-DOS程序是用來存儲某些用戶設置的。大多數現代操作系統都會通過設計阻止這樣的事情發生(例如,在啓動時鎖定可執行文件以使其不可修改,將可執行文件加載到內存中,並將該內存標記爲不可修改),並且如果操作系統允許,安全軟件可能會阻止它。正是因爲試圖修改可執行文件或運行代碼是很多惡意軟件所做的。 – Peter

+0

我不明白爲什麼這個問題得到了2個贊成票,這並沒有那麼糟糕。不如好的,但似乎很好。 –

回答

4

以下是關於爲什麼它不是一個好主意的一些提示。

  • 這並不比使用其他文件更好。
    • 你不能以「我所有的數據」的形式訪問一大塊內存並將其寫入文件,因此您必須正確序列化/反序列化。一旦你有這個代碼可用,它實際上是更多工作與複雜的文件格式(ELFPE)混合寫入空文件。
  • 實際上它更糟。
    • 錯誤寫入數據可能會使您的程序無法工作。
    • 多個用戶不能分別擁有自己的數據。
  • 您的可執行文件通常不可寫入。
    • 在基於Unix的系統上,二進制文件通常安裝到系統目錄,普通用戶根本無法更改它們。
    • 即使以超級用戶身份運行,系統分區也是隻讀的(我自己的安裝程序已將/作爲只讀文件掛載)並不少見。
    • 在Windows系統上,雖然使用管理權限運行更爲常見,但它並不是通用的,無論如何,正在運行的程序的二進制文件被鎖定。
  • 即使您設法解決所有這些問題,它也會阻止數據可移植性。
    • 你的程序和數據的安裝和更新消失了。
    • 沒有辦法備份您的數據並稍後恢復(可能在另一個系統上)。
  • 那些日子唯一修改可執行文件的程序是惡意軟件。由於這個原因,攔截可執行程序修改程序並將其關閉是反惡意軟件軟件最基本的功能之一。
    • 沿着這些路線,在實現簽名二進制或任何類型信任系統的系統上,您的修改二進制文件不會通過簽名測試。

所以,很多怪癖的,很多都在你的程序和用戶體驗的複雜的解決方法(需要申請特殊權限,棘手的保存和備份,極有可能造成數據丟失)。另一方面,簡單的保存到數據文件很容易實現和用戶友好。

0

正如在評論@drescherjm和@Peter提到,這種做法有什麼安全軟件查找,所以它不是一個真正的聰明的想法。 我不是非常瞭解你的意圖,但如果你想你的程序中實現協同例程這裏是你可以做什麼:

  • 創建一個static變量,說static int state=0;,並用它來實現合作程序生命週期的例程。
  • 使用一個文件,說「Sys_Status.dat」來存儲這些變量的信息。
+0

更好的辦法是將狀態或配置數據存儲在文件中。文件的一個目的是在程序終止後需要存儲數據。 –

+0

@ThomasMatthews這就是我所說的。 –

相關問題