2013-12-17 36 views
1
#include <stdio.h> 
#include <string.h> 

static const char nameOfFile[] = "blablabla.txt"; 
char lineG [128]; 

static char * readLine() 
{ 
    static FILE *file; 
    if(file == NULL) 
     file = fopen (nameOfFile, "r"); //opens the file 

    if (file != NULL) 
    { 
     if(fgets (lineG, sizeof (lineG), file) != NULL) //reads a line from file 
      return lineG; 
     else 
      fclose (file); 
    } 

    else perror (nameOfFile); 
    return NULL; 
} 

int main (void) 
{ 
    char *line, a; 
    line=readLine(); 
    char c; 
    int a[30],b[30]; 

    sscanf(line,"%c %d%d%d%d",&c,a[0],b[0],a[1],b[1]); 

    return 0; 
} 

正如你在那裏看到的,我試圖從文件中讀取int字符串。但我不知道有多少個int夫婦(如12,23)會有。我正在尋找適合所有人的解決方案。
txt文件將是這樣的(兩個或更多個線)如何從字符串中讀取整數,當你不知道有多少整數? (在C中)

 
A 12,54;34,65;54,56;98,90 
B 23,87;56,98 
+0

在初始化*之前,在'file' *上檢查'NULL'是錯誤的。 – unwind

+0

@unwind請注意,變量聲明爲「靜態」。 –

+0

@JoachimPileborg Gaah,謝謝!完全錯過了。然後檢查是毫無意義的,對吧? :) – unwind

回答

1

使用%n格式指示符和一次讀取一個整數。 %n的相關參數將填入sscanf()讀取字符串的索引。來自C99標準的格式說明符n的說明:

沒有輸入消耗。 對應參數應是指向 符號整數成將被寫入從 輸入流到目前爲止由該調用fscanf函數讀取的字符的數目。執行 %n指令不會增加在執行fscanf函數完成時返回的賦值計數。沒有參數被轉換, 但一個被消耗。如果轉換規範包含禁止 字符或字段寬度的分配,則行爲未定義。

(使用malloc())動態分配的數組將需要存儲int S和(使用realloc())根據需要進行擴展。用於讀取int S(但不添加到陣列)簡單的例子:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    const char* in = "15 16 17 18"; 
    int i; 
    int pos = 0; 
    int total_pos = 0; 

    while (1 == sscanf(in + total_pos, "%d%n", &i, &pos)) 
    { 
     total_pos += pos; 
     printf("i=%d\n", i); 
    } 

    return 0; 
} 

見在線演示@http://ideone.com/sWcgw0

1

要讀取X數字,您只需在循環中一次讀取一個數字。這裏的問題是,數字不是由空格分隔,而是以逗號和分號分隔。這不能簡單地通過簡單的sscanf來處理。

取而代之,我建議你先在行中首先提取字母,然後用strtok將剩餘的分號分開,然後再使用strtok分割逗號。然後,您可以使用strtol將字符串中的數字轉換爲整數值。