簡體   English   中英

用C語言編寫和讀取文件

[英]writing and reading into a file in C language

最近,我已經開始在C語言中像fopen fwrite之類的東西學習文件I / O。 我有一個關於寫入/讀取具有指向文件指針的結構的問題。 假設結構看起來像這樣

  struct {
  int len;
  int* data;
  }intarr;

len是數組的長度

數據指向整數數組。

假設我知道該結構是什么(以便以后可以再讀取),則需要以二進制格式將len和數據寫入該文件。 但是,如果僅將結構寫入文件,則僅將指針而不是內容保存到文件中。

我當前的方法是將數據復制到新數組中,然后將len和新數組分別寫入文件中。

我不太確定我的方法是否正確。 如果正確,您應該如何讀回它們? 如果不是,當我們要將帶有指針的結構的所有內容寫入文件以便以后可以讀回它們時,我們應該怎么做?...我還是編程新手,所以如果我說錯了話,請糾正我。

閱讀有關序列化應用程序檢查點的信息 另請參閱文件文件系統

您可以先寫len然后fwrite數組內容:

 if (fwrite(&intarr.len, sizeof(int), 1, file)) != 1)
   { perror("write length failure"); exit(EXIT_FAILURE); };
 if (fwrite(intarr.arr, sizeof(int), intarr.len, file) != intarr.len)
   { perror("write array failure"); exit(EXIT_FAILURE); };

要讀回數據(例如,在rewind(3)之后或fopen file ),請先讀取長度,然后分配並讀取數組:

 if (fread(&intarr.len, sizeof(int), 1, file)) != 1)
   { perror("read length failure"); exit(EXIT_FAILURE); };
 intarr.arr = malloc(sizeof(int)*intarr.len));
 if (!intarr.arr) { perror ("malloc failure"); exit(EXIT_FAILURE); };
 if (fread(intarr.arr, sizeof(int), intarr.len, file) != intarr.len)
   { perror("read array failure"); exit(EXIT_FAILURE); };

另請參閱有關靈活數組成員fwrite(3)的信息 請注意, stdio文件流保持當前文件位置(因此,數據將按順序寫入,而不是被覆蓋),您可以使用ftell(3)查詢。 某些文件流(例如在Linux上,在pipe(7) -s以上,即來自popen(3)的文件流)是不可搜索的。

實際上,您可以以文本格式(如JSON)進行序列化和/或使用數據庫 (例如SqlitePostgreSQLMongoDb ....); 文本格式更易於移植,更易於調試。 而且由於磁盤的速度可能比CPU慢一百萬倍,因此值得花費一些處理時間來組織磁盤上的數據。

暫無
暫無

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

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