2011-01-14 134 views
3

我應該從類似這種格式的文件讀取輸入和參數:如何從文件中讀取特定格式的數據?

Add id:324 name:"john" name2:"doe" num1:2009 num2:5 num2:20 

問題是我不能用fgets。我試着用fscanf,但不知道如何忽略「:」並將字符串'name:'john''分開。

+0

爲什麼你不允許使用fgets?這是一項家庭作業嗎? – JeremyP 2011-01-14 10:43:30

回答

6

如果你確切地知道輸入文件將在一個結構良好的,非常具體的格式,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()之類的其他函數以及不需要解析的東西。

1

也許這就是你想要的?

#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 
+0

不,我正在嘗試提取John,Doe,2009等,並將它們存儲在帶有唯一ID的鏈接列表中。我對程序的其餘部分沒有任何問題,我只是無法弄清楚如何從文件中提取正確的字符串和整數。我應該使用其他的東西而不是scanf? – marr 2011-01-14 10:23:25

相關問題