2012-06-01 74 views
0

我正在嘗試從文本文件中讀取數據&將其存儲在具有一個char指針的結構中& int變量。 從文件中獲取數據期間,我知道將有一個字符串來獲取一個整數值。 我也知道位置表單,我必須開始提取。 我不知道的是字符串的大小。 那麼,我該如何爲該String分配內存。 示例代碼是在這裏:在您的幫助如何動態地爲字符串分配內存?

struct filevalue 
{ 
char *string; 
int integer; 
} value;  
fseek(ptr,18,SEEK_SET);//seeking from start of file to position from where I get String 
fscanf(ptr,"%s",value.string);//ptr is file pointer 

fseek(ptr,21,SEEK_CUR);//Now seeking from current position 
fscanf(ptr,"%d",value.integer); 

感謝。

+0

家庭作業,對吧? – 2012-06-01 07:03:45

+0

不能工作的人只能工作 – tod

+0

您需要知道所需的長度,然後使用'malloc()'並記住爲空終止符添加一個。 – hmjd

回答

0

要麼

  1. malloc的最大可能長度
  2. 讀取多入malloc分配塊
  3. 弄清楚其中所述串的實際端是
  4. 寫信\0到你的malloc分配塊存在,因此正確地表現爲一個空終止字符串(和/或過保存長度的情況下,你需要它)
  5. 可選ReAlloc如果您的塊大小正確

或者

  1. 的malloc合理瞎猜ñ的長度
  2. 讀那麼多
  3. 如果你不能找到結束字符串在緩衝區:
    1. 成長與realloc的緩衝區2N(例如),並讀取下一個Ñ字節到結束
    2. 轉到3
  4. 寫信\0等等如上

你在該評論說最大。字符串長度是有界的,所以第一種方法可能很好。你還沒說你怎麼找出其中的字符串結尾,但我假設有一些分隔符,或者它是正確的,充滿了空間,或什麼的。

+0

我沒有說最大。字符串大小是有限的,但我可以使用你的想法,因爲在我必須訪問的每個文件中都有一個通用模式,我發現在每個字符串(我需要)後都有一個換行符。我可以檢查它,可以計算長度。 – tod

0

在第二個fseek()中是否指SEEK_CUR?如果是這樣,那麼你知道字符串的長度。使用固定大小的緩衝區。

+0

需要在文件中轉義的文本是固定長度的 – tod

+0

所以當我得到字符串後,我可以從那個位置尋找從我必須取整數值的位置。我的意思是字符串和Integer之間的距離是固定的,但字符串長度不固定。 – tod

+0

字符串長度不固定*但是*有一個已知的上限 - 它不能比已知的字符串開始和已知的整數開始之間的間隔長。因此,假設最壞的情況和數組大小的硬編碼。 – 2012-06-01 09:21:56

0

如果知道該第一結構的位置,並且所述第二結構的位置,你也知道第一結構的總長度(第二的位置 - 的第一位置)。您還知道結構的整數部分的大小,因此您可以輕鬆計算字符串的長度。

off_t pos1; /* Position of first structure */ 
off_t pos2; /* Position of second structure */ 

size_t struct_len = pos2 - pos1; 
size_t string_len = struct_len - sizeof(int); 
+0

我知道從字符串結束到文本開始的整數&文件開始字符串的大小。但從文件開始到整數值開始的文本大小再次是不確定的。 – tod

0

我假設你用二進制模式打開文件,因爲你使用fseek。

你可以使用fgetc()從文件中讀取,因爲你不知道大小隻是分配一個像100這樣的初始大小的緩衝區,然後通過char讀取char將它們放入緩衝區。監視緩衝區是否足夠大以容納字符,如果不是,則緩衝區設置爲較大的大小。