[英]I am having trouble using fscanf to load data from a file into structs
我在使用 fscanf 時遇到問題,不勝感激。 我正在嘗試從我控制的文件中讀取。 因為我知道格式,所以我試圖從該文件中讀取。
typedef struct {
char *website;
char *user;
char *password;
char *description;
} Account;
typedef struct Database Database;
struct Database {
int number_of_acc;
Account **accounts;
};
int
load_database(Database *db, FILE *fp) {
char website[MAX_BUFFER_SIZE], username[MAX_BUFFER_SIZE], password[MAX_BUFFER_SIZE];
Account acc;
if (db->number_of_acc == 0)
db->accounts = malloc(5*sizeof(acc));
while(fscanf(fp, "%s: %s, %s", website, username, password ) == 3) {
if(db->number_of_acc > 5)
db->accounts = malloc(2*db->number_of_acc*sizeof(acc));
acc.website = website;
acc.user = username;
acc.password = password;
//acc.description = description;
db->accounts = malloc(sizeof(acc));
db->number_of_acc += 1;
}
return Success;
}
然而,當通過 gdb fscanf 沒有返回 3 所以 while 循環被忽略。 這是輸入文件。
Reddit: Username, Password
非常感謝任何關於我的代碼的建議和幫助。 感謝您的時間。
將評論轉換為答案。
fscanf()
的問題第二個%s
最多讀取一個空格字符; 根據定義,下一個字符不是逗號。 您可能需要使用(負)掃描集: %[^,]
最多讀取但不包括逗號。 您應該通過指定%s
和%[…]
的大小來避免緩沖區溢出 — 請參閱如何防止 scanf() 在 C 中導致緩沖區溢出?
請注意,正如ryyker 指出的那樣,您也有 memory 管理問題。 您需要檢查您的 memory 分配是否成功,第二個應該使用realloc()
,而不是malloc()
(以避免 memory 泄漏和已輸入數據的丟失)。 仍然省略了錯誤檢查——最好將realloc()
的結果分配給一個新變量,這樣如果重新分配失敗,您就不會丟失指向先前分配的指針。
if (db->number_of_acc == 0)
{
db->accounts = malloc(5*sizeof(acc));
db->number_of_acc = 5;
}
和
if (db->number_of_acc >= db->number_of_acc)
{
db->accounts = realloc(db->accounts, 2*db->number_of_acc*sizeof(acc));
db->number_of_acc *= 2;
}
您需要考慮關系運算符應該是>=
還是>
。
此外,復制讀取的數據的段落是虛假的:
acc.website = website;
acc.user = username;
acc.password = password;
//acc.description = description;
db->accounts = malloc(sizeof(acc));
db->number_of_acc += 1;
您沒有顯示結構定義,但如果它包含 arrays,則需要使用strcpy()
,如果它包含指針,則需要使用strdup()
或等效的 function。 您還需要分配給數組的正確元素,並將數據復制到分配的空間中。
我不打算解決這個問題——關於這個主題的問題不完整,因此無法明確回答。 從表面上看,你有一個結構數組; 您應該將新輸入的數據復制到下一個可用結構中。 您需要單獨的計數器來計算數組中分配的結構數量和正在使用的數量(或者,等效地,下一個要使用的條目的索引)。
如果您仍有問題,請提出一個新問題,但請閱讀有關如何創建 MCVE(最小、完整、可驗證示例- 或 MRE 或 SO 現在使用的任何名稱)或 SSCCE(簡短、自包含、正確示例)的信息 -同一個想法用不同的名字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.