0

私が間違っていることを教えてください。

テキスト ファイルからデータを読み取り、それらのデータを構造体を指すポインターの配列に保存するコードを作成しようとしています。グローバル識別子を使用しないことが重要です。

これは私が書いたものですが、関数nactiProdukty( readProductsfromFile) が終了するたびにエラーでクラッシュします: 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);
  }
}
4

1 に答える 1

1

この線

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

間違っている。fscanfのman ページから:

format 内の変換指定の数がポインター引数の数を超えた場合、結果は不定になります。

クラッシュは有効で一般的な未定義の結果です。これを修正するfscanfには、書き込み先の変数を指定し、結果を無視します。

int i;
char s[20];
while(fscanf(data,"%s %d", s, i) == 2){
于 2013-01-11T13:23:35.253 に答える