[英]How to save text file to struct with string in C++
我想將文件的內容保存到結構中。 我試過使用 seekg 和 read 寫入它,但它不起作用。
我的文件是這樣的:
johnmayer24ericclapton32
我想將姓名、姓氏和年齡存儲在這樣的結構中
typedef struct test_struct{
string name;
string last_name;
int age;
} test_struct;
這是我的代碼
int main(){
test_struct ts;
ifstream data_base;
data_base.open("test_file.txt");
data_base.seekg(0, ios_base::beg);
data_base.read(ts, sizeof(test_struct));
data_base.close();
return 0;
}
它不會編譯,因為它不希望我在 read 函數上使用 ts。 有沒有另一種方式 - 或一種方式 - 做到這一點?
您必須開發特定的算法,因為“字段”之間沒有分隔符。
static const std::string input_text = "johnmayer24ericclapton32";
static const std::string alphabet = "abcdefghijklmnopqrstuvwxyz";
static const std::string decimal_digit = "0123456789";
std::string::size_type position = 0;
std::string artist_name;
position = input_text.find_first_not_of(alphabet);
if (position != std::string::npos)
{
artist_name = input_text.substr(0, position - 1);
}
else
{
cerr << "Artist name not found.";
return EXIT_FAILURE;
}
同樣,您可以提取數字,然后使用std::stoi
將數字字符串轉換為內部表示數字。
編輯 1:拆分名稱
由於名字和姓氏之間沒有分隔符,您可能需要一個可能的名字列表,並使用它來找出名字的結尾和姓氏的開頭。
字符串的序列化/反序列化很棘手。
作為二進制數據,約定是先輸出字符串的長度,然后是字符串數據。
https://isocpp.org/wiki/faq/serialization#serialize-binary-format
- 字符串數據很棘手,因為您必須清楚地知道字符串的主體何時停止。 如果某些字符串可能包含該字符,則不能明確地以 '\\0' 終止所有字符串; 回想一下 std::string 可以存儲 '\\0'。 最簡單的解決方案是在字符串數據之前寫入整數長度。 確保整數長度以“網絡格式”寫入,以避免 sizeof 和 endian 問題(請參閱早期項目符號中的解決方案)。
這樣當讀回數據時,你知道期望的字符串長度,並且可以預先分配字符串的大小,然后從流中讀取那么多數據。
如果您的數據是非二進制(文本)格式,那就有點棘手了:
https://isocpp.org/wiki/faq/serialization#serialize-text-format
- 字符串數據很棘手,因為您必須清楚地知道字符串的主體何時停止。 如果某些字符串可能包含這些字符,則不能明確地使用 '\\n' 或 '"' 甚至 '\\0' 終止所有字符串。您可能想要使用 C++ 源代碼轉義序列,例如,編寫 '\\ ' 后跟 'n' 當你看到一個換行符等。在這個轉換之后,你可以讓字符串一直到行尾(意味着它們被 '\\n' 分隔)或者你可以用 '"' 分隔它們.
- 如果您對字符串數據使用類似 C++ 的轉義序列,請確保在 '\\x' 和 '\\u\u0026#39; 之后始終使用相同數量的十六進制數字。 我通常分別使用 2 位和 4 位數字。 原因:如果您編寫較少數量的十六進制數字,例如,如果您只是使用流 << "\\x" << hex << unsigned(theChar),則當字符串中的下一個字符恰好是一個十六進制數字。 例如,如果字符串包含 '\\xF' 后跟 'A',你應該寫“\\x0FA”,而不是“\\xFA”。
- 如果您不對像“\\n”這樣的字符使用某種轉義序列,請注意操作系統不會弄亂您的字符串數據。 特別是,如果您打開沒有 std::ios::binary 的 std::fstream,某些操作系統會轉換行尾字符。 字符串數據的另一種方法是用整數長度作為字符串數據的前綴,例如,將“now is the time”寫為 15:now is the time。 請注意,這會使人們難以讀/寫文件,因為緊隨其后的值可能沒有可見的分隔符,但您仍然可能會發現它很有用。
基於文本的序列化/反序列化約定各不相同,但每行一個字段是公認的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.