簡體   English   中英

如何在C ++中使用字符串將文本文件保存到結構

[英]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.

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