2016-04-06 13 views
-5

コンパイルエラーや警告なしで次のコードを書いています。しかし、私のプログラムは毎回クラッシュしますか?どうして私はその問題を解決できますか?fscanfでファイルを読み取れません

コード

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

int main() 
{ 
    FILE *fp; 

    int vertexIndex=0; 
    float vertexTable[][2000]={0}; 
    int faceIndex = 0; 
    int faceTable[][2000]={0}; 
    char lineHeader[128]={0}; 

    fp = fopen("C://Users//matt//Desktop//mannekeCoord.txt","r"); 

    if(fp == NULL) 
    { 
    perror("Error in opening file"); 
    return(-1); 
    } 

    do 
    { 
    int res = fscanf(fp, "%s", lineHeader); 
    if(res ==EOF) 
     {break;} 

    //vertex 
    if (strcmp(lineHeader, "v") == 0){ 
     fscanf(fp, "%f %f %f\n", &vertexTable[vertexIndex][0], &vertexTable[vertexIndex][1], &vertexTable[vertexIndex][2]); 
     vertexIndex++; 
    } 

    //face 
    if (strcmp(lineHeader, "f") == 0){ 
     fscanf(fp, "%d//%d %d//%d %d//%d %d//%d\n", &faceTable[faceIndex][0], &faceTable[faceIndex][1], &faceTable[faceIndex][2], &faceTable[faceIndex][3], &faceTable[faceIndex][4], &faceTable[faceIndex][5], &faceTable[faceIndex][6], &faceTable[faceIndex][7]); 
     faceIndex++; 
    } 

    } while(1); 

    fclose(fp); 
    return 0; 
} 

これはそれを読むために持っていたファイルの内容の短いバージョンです:

v -0.999718 -1.004708 0.999546 

    v -0.932863 -2.122097 -1.108066 

    v -1.000000 1.000000 1.000000 

    v -0.980325 0.671164 -1.031669 

    v 0.094571 -2.805363 -1.376969 

    v -0.437903 -2.617016 -1.306834 

    f 728//48 782//48 785//48 751//48 

    f 758//48 788//48 789//48 759//48 

    f 727//48 783//48 782//48 728//48 

    f 793//402 797//402 796//402 792//402 

    f 790//48 794//48 797//48 793//48 

    f 791//403 795//403 794//403 790//403 

    f 783//404 791//404 790//404 782//404 

    f 784//405 792//405 796//405 788//405 

    f 789//48 797//48 794//48 786//48 

    f 786//406 794//406 795//406 787//406 

私はこのウェブサイトを使用してコンパイルします。http://www.onlinecompiler.net/

+3

オンラインデバッガもありますか? –

+0

**もし 'scanf'を使わないと**このプログラムをデバッグするほうが簡単でしょう。冗談じゃない。 ( 'scanf'を使わない理由はたくさんありますが、今は重要なのはデバッグです。)(テキストを機械番号に変換するには、整数に' strtol'、浮動小数点に 'strtod'を使用してください) – zwol

+2

ちょうど'faceTable'を見て、サイズが正しいかどうか、正確に宣言されているかどうか、正確に宣言されているかどうかを確かめてください... –

答えて

2

vertexTablefaceTableはいずれも2000年までにサイズが1であるため、未割り当てのメモリw HICHは、「未定義の動作」に

1

をリードしてこれらの宣言は間違っている:私はあなたがあれば、あなたはまだ問題に実行されますことを知っている願っています

float vertexTable[2000][3]={0}; 
int faceTable[2000][8]={0}; 

float vertexTable[][2000]={0}; 
int faceTable[][2000]={0}; 

は、代わりにあなたはこれを必要とします頂点数または面数が2000を超えています。

+0

はmallocを本当に唯一の解決策ですか? –

関連する問題