2013-01-11 58 views
0

請問我可以指點我做錯了什麼?數組指針 - 從文件中讀取 - 崩潰

我想寫一些代碼,將讀取文本文件中的數據,並將這些數據保存到指針數組,指向結構。關鍵是我不使用任何全局標識符。

這是我寫的,但每次功能nactiProduktyreadProductsfromFile)結束它崩潰與錯誤:First-chance exception at 0x73006500 in ConsoleApplication3.exe: 0xC0000005: Access violation executing location 0x73006500。但是從文件讀取似乎工作正常。

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

typedef struct produkt { 
    char jmeno[20]; 
    int mnozstvi; 
    int cena; 
} tProdukt; 


int SpoctiProdukty(); 
int Generuj(int min, int max); 
void nactiProdukty(tProdukt **pole); 


void main(){ 
    tProdukt **pole=NULL; 

    int i; 

    srand(time(NULL)); 
    nactiProdukty(pole); 

    printf("test"); 
    scanf("%s"); 
} 

int SpoctiProdukty(){ 
    FILE *data=fopen("data.txt","r"); 
    int count=0; 
    while(fscanf(data,"%s %d") != EOF){ 
    count++; 
    } 
    fclose(data); 
    return count; 
} 

int Generuj(int min, int max){ 
    return (rand()%(max-min)+min); 
} 

void nactiProdukty(tProdukt **pole){ 
    FILE *data=fopen("data.txt","r"); 
    int temp; 
    int i; 
    char temps[20]; 
    int pocet=SpoctiProdukty(); 
    //tProdukt **pole; 

    pole=(tProdukt**)malloc(sizeof(tProdukt*)*pocet); 
    for (i = 0; i < pocet; i++) { 
    pole[i]=(tProdukt*)malloc(sizeof(tProdukt)); 
    }  

    for (i = 0; i < pocet; i++) { 
    fscanf(data,"%s %d",temps,&temp); 
    strcpy((*pole[i]).jmeno,temps); 
    (*pole[i]).cena=temp; 
    (*pole[i]).mnozstvi=Generuj(10,150); 
    } 
} 
+0

這不是關於C#.. –

+0

這是C++不是C#,後與C++代碼。 –

+0

並且不要在標題中加入標籤。這就是標籤字段的用途。 =) –

回答

1

while(fscanf(data,"%s %d") != EOF){ 

是錯誤的。從fscanf手冊頁:

If the number of conversion specifications in format exceeds the number of pointer arguments, the results are undefined.

崩潰是一個有效的和共同的未定義的結果。您可以通過提供變量fscanf寫,然後忽略結果解決這個問題:

int i; 
char s[20]; 
while(fscanf(data,"%s %d", s, i) == 2){