2012-07-12 29 views
1

我有被格式化這樣的約2000文本至極的行的文本文件:無法提取文本文件中的值用C

1 1名1 LastN1 58℃1600 1310.40 6 1 0.22 2164.80 1
2 1 Name2 LastN2 22 d 1700 1523.37 4 1 0.13 897.26 1
3 1 Name3 LastN3 34 c 1600 1195.84 2 1 0.26 836.16 1


2000年第3 NameX LastNX 46 d 6000 6000.00 1 0 0.00 0.00 1

我想要做的就是從文本文件閱讀所有這些值,並將其儲存到陣列至極什麼是:

int id   [2100]; 
char nombre [2100][30]; 
char apellido [2100][30]; 
int edad  [2100]; 
int puesto  [2100];  char categoria [2100]; 
int sueldoI  [2100]; 
float sueldoA [2100]; 
int antiguedad [2100]; 
int inscrito [2100]; 
float aporte [2100]; 
float ahorro [2100]; 
int libre  [2100]; 

但是,當我試圖閱讀,我收到了很多垃圾到控制檯

這是我使用的嘗試讀取並存儲到數組方式:

//Way number 1 
char linea[70]; 
while(fgets(linea,70,datos) != NULL){ 
    flushall(); 
    sscanf(linea,"%d %d %s %s %d %c %d %f %d %d %f %f %d\n",&id[i],&puesto[i],&nombre[i],&apellido[i],&edad[i],&categoria[i],&sueldoI[i],&sueldoA[i],&antiguedad[i],&inscrito[i],&aporte[i],&ahorro[i],&libre[i]);  
    i++; 
} 

// Way number 2 in here i get linea the way it's intended to be but i can't figure 
// out a way to split the string into the multiple values i need to store in the arrays 

while(fgets(linea,70,datos) != NULL){ 
    printf("%s",linea); 
} 

這是輸出我在第一種方式獲得:

Way #1 output

編輯:

我已經修改了數組的大小二一〇〇年至2000年,程序似乎表現更好

+0

你能再發表一些代碼嗎?具體來說,你有什麼聲明'linea'爲? – 2012-07-12 04:54:02

+0

當然我會將它添加到問題,但linea聲明爲'char linea [70];' – 2012-07-12 04:54:53

+0

第一種方式的輸出是什麼? – 2012-07-12 04:58:53

回答

5

&nombre[i]&apellido[i]中刪除運算符的地址,它們是數組,您可以使用數組名稱而不使用地址拿到第一個元素的地址:

sscanf(/*....*/, nombre[i], apellido[i], /*....*/); 

另外,對於字符串,應指定期望的字符串長度的scanf(您的數組大小 - 1):

sscanf(linea, "... %29s %29s ....", /*....*/, nombre[i], apellido[i], /*....*/); 

,你可能會被濫用i

int main() { 
    char linea[70]; 
    FILE *datos = fopen("datos", "r"); 
    int i= 0; 
    while(fgets(linea,70,datos) != NULL){ 
    sscanf(linea,"%d %d %29s %29s %d %c %d %f %d %d %f %f %d\n", &id[i], &puesto[i], 
     nombre[i], apellido[i],&edad[i],&categoria[i],&sueldoI[i], 
     &sueldoA[i],&antiguedad[i],&inscrito[i],&aporte[i],&ahorro[i], 
     &libre[i]); 
    i++; 
    } 

    i--; 

    for (; i >= 0; i--) { 
    printf("%d %s\n", id[i], nombre[i]); 
    } 

    return 0; 
} 
+0

仍然將垃圾作爲輸出 – 2012-07-12 05:02:22

+1

+1,但我會考慮改寫答案,以使其聽起來不像&對於數組來說不是必需的。(「他們是數組,你可以只使用數組名稱而不使用地址)」例如,'int a [5]; scanf(「%d」,a [0]);' – Corbin 2012-07-12 05:04:57

+0

將數組的大小添加到'%s'現在看起來像這個'%29s'並且仍然垃圾 – 2012-07-12 05:07:30