2016-10-12 64 views
1

我想使用的fscanf從infile中讀入(這是可以標準輸入或文件)爲表示像這樣的文件:閱讀與文本文件逗號

1,2,3 
4,5,6 

待辦事項忽視的事實他們是數字 - 我將它們表示爲字符串。

我所做的是我用

fscanf(infile, "%s%*c %s%*c %s%*c[^\n]", x, y, z); where x, y, z are string variables. 

我期待每一個代表數字,在該行,被存放在X,Y,Z,但它不工作,而不是存儲整個單獨在x行。

請幫忙嗎?謝謝。

+0

有許多o行工具來檢查常規表達式:http://www.freeformatter.com/regex-tester.html – Asaf

+2

@Asaf'scanf'不使用正則表達式。 – jamesdlin

+0

你可能更願意用'fgets'(或'getline',如果有的話)閱讀整行文本並用'strtok'標記它。 'scanf'(和'fscanf')是非常難以正確使用的。 – jamesdlin

回答

1

您正在使用'%s',它會將整個單詞讀入空格。因此1,2,3被讀入x的第一行。

你需要做的是採取xyz爲整數,然後你就可以讀三個整數和使用各種方法(例如itoa

int x,y,z; 
char x_str[20], y_str[20], z_str[20]; 
//... 
fscanf(infile, "%d,%d,%d", x, y, z); 
itoa{x,x_str,10); // and so on 
+0

不失泛化z實際上是一個字符串,它是一個包含單詞和數字的字符串。 – TimelordViktorious

+0

在這種情況下,可以使用'fscanf(infile,「%d,%d,%s」,x,y,z_str);'讀取文件的一行。 'z_str'是一個字符串,可以直接讀取。 –

0

其轉換爲字符串如果使用scanf/fscanf,那麼你想使用%[^,]作爲輸入格式而不是%s,%s將盡可能多的讀取; %[^,]將讀取由字符組成的字符串(包括空格)不在,

fscanf(infile, "%[^,],%[^,],%[^,]", x, y, z); 

請注意,fscanf上面使用是不安全因爲它什麼都不做限制的字符數讀入每個字符串。因此,它完全容易受到緩衝區溢出攻擊。


就個人而言,我會閱讀fgets(或getline如果可用)的整條生產線,然後用strtok記號化它,。通常應該避免使用scanf/fscanf are notoriously hard to use correctly

+0

如果它的格式是OP(x,y,z \ n),你可能想要類似'「%[^,],%[^,],%[^ \ n]」'空格後的空格。我想這只是讓你的觀點:) – rici