2013-02-25 45 views
1

我想要做的一個字符串:在文件輸入和存儲可以是任意長度的用戶希望

存儲記錄。這些記錄有兩件事。

time_t rt; //which stores the time the record was entered by the user 

並伴隨此我想存儲一個字符串。但我不知道字符串的長度。

它將根據運行時間決定,並取決於用戶輸入的字符數。

什麼需要做的(據我):

我不知道。我知道動態內存分配,但不知道如何將此應用於這樣的問題。

我曾嘗試:

我試圖把一個charachter在來自用戶的時間,並將其存儲在一個文本文件(暫時)。

ofstream fileObject; 

fileObject.open("temp.txt"); 

for(int j=0;;j++) 
{ 
    ch = _getche(); 

if(ch == 13) break; //user has pressed the return key 

    fileObject<<ch; 
} 

然後我發現了文件的大小使用以下代碼:

fileObject.seekp(0,ios::end); 

long pos = fileObject.tellg(); //this is the size of the file 

然後我聲明的文件的大小的動態數組。

char * entry; 

entry = new char[pos] 

在「out」模式下關閉文件並在「in」模式下再次打開文件。

fileObject.close(); 

ifstream fout; 

fout.open("temp.txt"); //this is the name of the text file that i had given 

然後性格聰明我複製的文本文件的內容到字符數組:

for(int i=0;i<pos;i++) 

    fout>>info[i]; 

info[i] = '\0'; 

fout.close(); 

但現在我不知道該怎麼做進一步。

我需要你什麼來幫助我:

幫我寫這個記錄作爲一類對象轉換成二進制「.DAT」文件。

我的規格:

的Windows XP SP 3

IDE:的Visual C++ 2010速成

+0

C++?你有沒有考慮過使用std lib中的字符串? – 2013-02-25 09:21:26

+0

先生,問題已解決 – IcyFlame 2013-02-25 09:27:19

+0

是的。我被要求使用它。 – IcyFlame 2013-02-25 09:27:37

回答

1

對字符串有什麼限制?你怎麼知道用戶已經輸入了他想要的所有數據,在 這個字符串中?

如果字符串是單行線,我們可以假設 「合理」的長度(即,它會很容易融入內存),然後 你可以使用std::getline得到串入一個 std::string(用於輸入),然後定義輸出格式, 說"%Y-%m-%d %H:%M:%S: user string\n"爲 的文件。如果用戶字符串可以是多行,則您將有 來定義輸入它們的協議(以便您可以知道何時完成單個記錄的 )以及 文件的更復雜的格式:一個建議是通過空行 行(表示輸入不能包含空行), 或使用沿着以下行的記錄標頭分隔記錄:"%Y-%m-%d %H:%M:%S line_count\n"。 (Subversion使用 的這爲它的消息commit的變體。隨着越來越多的比特 信息,但是,但是時間戳和線 是存在的數量。)

+0

get line函數遇到返回鍵時會停止輸入嗎?默認? – IcyFlame 2013-02-26 07:34:44

+0

這就是字符數組的原理。 – IcyFlame 2013-02-26 07:35:04

+0

並且在字符數組中還有一個選項可以通過選擇給出分隔符。 cin.getline(arr,25,'。')將佔用期間'。'作爲分隔符。這裏是否允許同樣的事情? – IcyFlame 2013-02-26 07:36:08

1

使用std::stringstd::getline,無論是從<string>

1

我想存儲一個字符串。但我不知道字符串的長度。

然後,您需要使用std::string而不是預分配的數組char s。

struct user_record 
{ 
    time_t rt; //which stores the time the record was entered by the user 
    std::string one_string; 
}; 

幫我寫這個記錄作爲一類對象轉換成二進制「.DAT」文件。

有許多序列化選項可供您使用。也許最簡單的是使用標準的流操作寫爲純文本:

std::ostream& operator <<(std::ostream& os, user_record const& ur) 
{ 
    return os << ur.rt << ' ' << ur.one_string; 
} 

std::istream& operator >>(std::istream& is, user_record& ur) 
{ 
    return is >> ur.rt >> ur.one_string; 
} 

對於什麼比一個單行字符串更多的參與,那麼也許你應該調查Boostserialisation庫。

+0

哦!我不知道那件事。我會谷歌它並找出。謝謝你提到我。但是,我將如何聲明一個具有各種大小實例的類? – IcyFlame 2013-02-25 09:22:44

+0

非常感謝你的先生。你確實解決了我的問題! @Johnsyweb – IcyFlame 2013-02-25 09:26:59

+2

你不應該只是谷歌它。更好地爲初學者選擇一本好的C++書籍(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – Philipp 2013-02-25 09:27:55

1

如果您使用的是C++,那麼std::string是最好的。

std::string abc=""; 
相關問題