-1

保存されたデータをファイルから読み込もうとしています。バッファ内の情報を文字列から文字に変換し、その値を構造体のメンバーに割り当てようとしています。データが正しくアクセスされていないようです。ノードの値を出力すると、ファイルに保存されているものとは異なります。どこが間違っているのかわかりません。

ファイル形式:

    3 2 43 4 
    2 4 5 6
    $Node
    4
    1 0 -1 0
    2 0 1 0 
    3 10 -1 0
    4 10 1 0
    $EndNodes
    $Elements
    2
    1 2 3 4 
    2 3 5 6
    $EndElements

コード:

    struct Node {
        int x; // position                                                 
        int y; //position                                                  
        int z; //position                                                  
        int total_node_nums;  // total node numbers                        
    };

    struct Element{
        int total_elmt_num; // total element numbers                      
        struct Node *node; // array of nodes                               
    };

メインからの呼び出し:

    void arr_creator(char *fname, char *str_start, char *str_end); 

arr_creator:

void arr_creator(char *fname, char *str_start, char *str_end){ 

    FILE *fl_read; 
    char buffer[512], line_buff[20]; 
    int i,num_node,tag,line = 0; 

    fl_read = fopen(fname, "r"); 
    if(fl_read == NULL){
        printf("\n[error reading file] :: in function arr_creator\n");
        return; 
    }

    // Scan file for str_start
    while(fgets(buffer, sizeof(buffer),fl_read) != NULL ) {

        if(strstr(buffer,str_start)){ 
            printf("\nline: %d   string: %s \n",line+1, str_start); 

            fgets(buffer,sizeof(buffer),fl_read); 

            num_node = atoi(buffer); 
            printf("num_node = %d\n", num_node); 
            struct Node *node; 
            node = malloc((num_node+1)*sizeof(node)); 

            for(i=1; i<num_node+1;i++){

                sscanf(buffer,"%d %d %d %d", &tag, &node[i].x, &node[i].y, &node[i].z);

                printf("--------------\n"); 
                printf("   Node %d   \n", tag); 
                printf("--------------\n"); 
                printf("node[%d].x = %d\n",i, node[i].x); 
                printf("node[%d].y = %d\n",i, node[i].y); 
                printf("node[%d].z = %d\n",i, node[i].z); 
                printf("BUFFER  ::  %s", buffer); 
            } 
        }
        line++;
        if(strstr(buffer,str_end)){
            printf("buffer at break :: %s", buffer); 
            // buffer[0] = '\0'; 
            break; 
        }   
     }
     if(fl_read){
         fclose(fl_read); 
     }
}
4

3 に答える 3

1

ループ内でfgets 再度呼び出す必要があります。for同じバッファの内容を何度も読んでいるだけです。そして、それはまだ数字が 1 つしかない最初の行です。

于 2013-04-27T02:22:25.910 に答える
1

メモリを正しく割り当てていません。私はこれらの 4 つの行を参照しますが、最後の行が主な違反者であり、他の行もあまり良くありません。を格納するために必要なスペースよりも少ないスペースをstruct Node割り当てると、割り当てられた領域を超えてアクセスしようとすると、未定義の動作が発生します。

num_node = atoi(buffer); 
printf("num_node = %d\n", num_node); 
struct Node *node; 
node = malloc((num_node+1)*sizeof(node)); 

nodeポインタです。ポインターのサイズはどのくらいだと思いますか? それはおそらくあなたが望んでいるものではありません。

これはかなりばかげており、 を使用しintて割り当てるオブジェクトの数を決定します。誰かが負の数を入力した場合はどうなりますか? sscanf戻り値の処理方法に注意してください。いつかあなたを救うかもしれません。詳細については、opengroup scanf マニュアルを参照してください(「opengroup scanf マニュアル」を覚えておいてください。何を検索すればよいかがわかります)。

size_t num_node; /* Suggestion: USE A SIZE TYPE! It's what they're for. */
assert(sscanf(buffer, "%zu", &num_node) == 1);
printf("num_node = %zu\n", num_node); 
struct Node *node; 
node = malloc((num_node+1) * sizeof *node);

*nodeポインターではありません。現物です。オブジェクトのサイズの観点から割り当てたいと思いますよね?

あなたのファイル形式の外観から、行数はそれぞれの別の行にあると思いますnode。その場合、解析を試みる前に別の行を fgets する必要があります。

/* TODO: Handle read errors, rather than just `assert`ing that the read succeeds */
assert(fgets(buffer,sizeof buffer,fl_read) == buffer)

/* TODO: Handle parsing errors, rather than just `assert`ing that the parsing succeeds */
assert(sscanf(buffer,"%d %d %d %d", &tag, &node[i].x, &node[i].y, &node[i].z) == 4)
于 2013-04-27T02:22:59.020 に答える