2014-03-30 26 views
0

我從掃描文件中的字符串出現問題,直到出現整數值。 如果我嘗試fgets(str,30,file);它掃描一行文件中的所有內容,包括整數。文件從文件行掃描直到C中的整數

例子:

Audi 2014 
Wall Street 1995 
The number of words used in one line may vary 9999 

整數總是最後但數目字前值並不總是相同的,所以像fscanf(file,"%s %s %d", str1, str2, &integer);代碼不能正常工作。 我的意圖是掃描一切,直到字符串中的整數值和分別掃描整數。 任何想法?

謝謝你們。

+0

你想整數值或文字嗎? –

+1

兩者。我需要在單獨的字符串和整數的文本部分。 – Toesmash

回答

2

這是光禿禿的骨頭C,沒有花哨的東西。如果您的數據具有您所描述的格式,即在文本文件中將空格分隔的單詞與換行符之前的每行代碼相隔離,並且每行至少以一個不是您的數字的單詞開頭,則它將起作用。緩衝區的大小可以隨意改變,只會影響性能。 另外,您的文件需要至少有一行描述的格式。

FILE *f; 
char bf[2048]; 
char *p, *p1; 
int line, i, num; 

f = fopen("mydatafile.txt", "r"); 
if (f) 
{ 
    line = 0; 
    while (!feof(f)) 
    { 
     fgets(bf, sizeof(bf), f); 
     p1 = bf; 
     p = strchr(bf, '\n'); 
     while(p) 
     { 
      *p = 0; 
      i = 0; 
      while (isdigit(p[--i])) ; 
      num = atoi(p+i+1); 
      p[i] = 0; 
      printf("line %d: %s number = %d\n",++line, p1, num); 
      p1 = p+1; 
      p = strchr(p1, '\n'); 
     } 
    } 
    fclose(f); 
} 

爲了您的樣本數據輸出爲:

line 1: Audi number = 2014 
line 2: Wall Street number = 1995 
line 3: The number of words used in one line may vary number = 9999 
+0

這很好用! :) 非常感謝你的幫助 – Toesmash

2

使用fgets進行讀取,並通過字符串while(!isdigit[str[i++]);進行一次讀取以獲取數字的起始位置。然後atoi從該位置,並把'\0'

fgets(str,30,file); 
int i = 0; 
while(str[i]!='\0' && !isdigit(str[i])) 
    i++; 
int num = atoi(str + i); 
str[i] = '\0'; 

現在的數量是num和字符串之前,它是在str

+0

如果這個數字超過了26位,那麼你有問題 –

+0

@valter怎麼回事? – avmohan

+0

fgets也包含'\ 0'。所以如果數字從第27位開始,你只需要3位數字。更糟糕的是,如果這個數字更大,你只能使用文本。 –

1

閱讀整條生產線,做你自己的分析,或使用的fscanf。模式「%29 [^ 0-9]%d」或類似的東西。

1

如果你只需要在你的輸入線這些數字,你可以使用下面的代碼來實現自己的目標

while (scanf("%*[^0-9]%d", &num) == 1) { 

*表示該號碼之前的非數字字符將被忽略。