我應該從類似這種格式的文件讀取輸入和參數:如何從文件中讀取特定格式的數據?
Add id:324 name:"john" name2:"doe" num1:2009 num2:5 num2:20
問題是我不能用fgets。我試着用fscanf,但不知道如何忽略「:」並將字符串'name:'john''分開。
我應該從類似這種格式的文件讀取輸入和參數:如何從文件中讀取特定格式的數據?
Add id:324 name:"john" name2:"doe" num1:2009 num2:5 num2:20
問題是我不能用fgets。我試着用fscanf,但不知道如何忽略「:」並將字符串'name:'john''分開。
如果你確切地知道輸入文件將在一個結構良好的,非常具體的格式,fscanf()
始終是一個選項,並做了很多爲你工作。下面我使用sscanf()
而不是創建一個文件來說明。您可以將呼叫更改爲使用fscanf()
作爲文件。
#define MAXSIZE 32
const char *line = "Add id:324 name:\"john\" name2:\"doe\" num1:2009 num2:5 num3:20";
char op[MAXSIZE], name[MAXSIZE], name2[MAXSIZE];
int id, num1, num2, num3;
int count =
sscanf(line,
"%s "
"id:%d "
"name:\"%[^\"]\" " /* use "name:%s" if you want the quotes */
"name2:\"%[^\"]\" "
"num1:%d "
"num2:%d "
"num3:%d ", /* typo? */
op, &id, name, name2, &num1, &num2, &num3);
if (count == 7)
printf("%s %d %s %s %d %d %d\n", op, id, name, name2, num1, num2, num3);
else
printf("error scanning line\n");
輸出:
添加324 John Doe的2009年5月20
否則,我將手動解析輸入一次讀取一個字符或或在緩衝器中,如果把它無論出於何種原因使用fgets()
都是不允許的。緩存比恕我直言總是容易。然後你可以使用strtok()
之類的其他函數以及不需要解析的東西。
也許這就是你想要的?
#include <stdio.h>
#include <string.h>
int main()
{
char str[200];
FILE *fp;
fp = fopen("test.txt", "r");
while(fscanf(fp, "%s", str) == 1)
{
char* where = strchr(str, ':');
if(where != NULL)
{
printf(" ':' found at postion %d in string %s\n", where-str+1, str);
}else
{
printf("COMMAND : %s\n", str);
}
}
fclose(fp);
return 0;
}
如果它的輸出將是
COMMAND : Add
':' found at postion 3 in string id:324
':' found at postion 5 in string name:"john"
':' found at postion 6 in string name2:"doe"
':' found at postion 5 in string num1:2009
':' found at postion 5 in string num2:5
':' found at postion 5 in string num2:20
不,我正在嘗試提取John,Doe,2009等,並將它們存儲在帶有唯一ID的鏈接列表中。我對程序的其餘部分沒有任何問題,我只是無法弄清楚如何從文件中提取正確的字符串和整數。我應該使用其他的東西而不是scanf? – marr 2011-01-14 10:23:25
爲什麼你不允許使用fgets?這是一項家庭作業嗎? – JeremyP 2011-01-14 10:43:30