2017-02-17 7 views
0

練習に問題があります。私はファイルから#文字を読み込むときに読み込みを停止し、次に構造体の前に読み込みを開始してから製品を保管しなければならない2番目の構造体である書かれたファイルを読みます。手伝って頂けますか?ファイルからリンクされたリストを特殊文字で読み取る#

私は構造ファイルから読み込むことができませんし、文字#に停止します。 私は2つが必要と思う最初の法律は、構造誌の要素とそれらの構造体の第2法則と文字#で停止します。

このようなコードを書くことができる人はいますか?

別々のライン上の各項目のファイル、構造体製品の唯一のラインは同一線上にある:

(Cod_p名量)

全体のみに分離されますスペース。

次のようにファイルが構成されています

ENG0002
ハイストリート、8
ロンドン
イングランド
SCG8888ショーツ200
FFSF888シャツ200

TRA456456
公園道路、88
ロンドン
イングランド
ASDASD000ショーツ100
ADWC000シャツ1000年
YUAYOの靴122


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

struct magazine { 
    char cod_m[30]; 
    char adress[30]; 
    char city[30]; 
    char nation[30]; 
    struct product* p; 
    struct magazine* next; 
    `` 
}; 

struct product { 
    char cod_p[10]; 
    char name[20]; 
    int quantity; 
    struct product* next; 
}; 

void read_st(struct magazzino* m); 

int main() { 
    struct magazzino* mag; 
    read_st(mag); 
} 

void read_st(struct magazzino* m) { 
    FILE* fp; 
    fp = fopen("magazzino.txt", "r"); 

    while (!feof(fp)) { 
     struct magazzino* m = (struct magazzino*)malloc(sizeof(struct magazzino)); 
     fscanf(fp, "%s\n%s\n%s\n%s\n", &m->cod_m, &m->adress, &m->city, &m->nation); 
     m->next; 
     printf("%s\n%s\n%s\n%s\n", &m->cod_m, &m->adress, &m->city, &m->nation); 
    } 
} 

struct prodotto* LeggiProdotto(char filename) { 
    FILE* fp = fopen("magazzino.txt", "r"); 
    while (!feof(fp)) { 
     struct prodotto* p = (struct prodotto*)malloc(sizeof(struct prodotto)); 
    } 
} 
+1

ヒント: 'm-> next;'は何もしません。そして、[this](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)を読んでください。そして、 'LeggiProdotto'関数は何も役に立ちませんが、とにかく呼び出すことはありません。そして 'fopen 'したファイルは' fclose'しないでください。多分もっと問題があります。 –

+2

ああ、実際にどの問題が起きたのか忘れてしまった。 –

+0

ファイルから構造体を読み取ることができませんし、文字# – ilbranco

答えて

1

これは非常に困難解析問題であり、fscanf()はそれのために十分に洗練されていませんfscanf()は空白を区切り文字として扱うため、スペースを埋め込んだ文字列を読み取ることができないためです。さらに、fscanfであなたが望むものが得られない場合、あなたが得たことを伝えるのは難しいです。

代わりにfgets()を使用します。 fgets()は、文字列の最後に改行を残し

void rtrim(char *str) 
{ 
    str[strcspn(str, "\r\n")] = '\0'; 
} 

void read_magazzino(struct magazzino **m) 
{ 
    FILE* fp; 
    int finished = 0; 
    char buf[30]; 
    fp = fopen("magazzino.txt", "r"); 

    while (!finished) { 
     char *read = fgets(buf, 30, fp); 
     if (read != NULL && buf[0] != '\0') { 
      *m = malloc(sizeof(struct magazzino));  
      strcpy((*m)->cod_m, buf); 
      rtrim((*m)->cod_m); 
      fgets((*m)->adress, 30, fp); 
      rtrim((*m)->adress); 
      fgets((*m)->city, 30, fp); 
      rtrim((*m)->city); 
      fgets((*m)->nation, 30, fp); 
      rtrim((*m)->nation); 
      read_prodotto(fp, &(*m)->p); 
      m = &(*m)->next; 
     } 
     else { 
      *m = NULL; 
      finished = 1; 
     } 
    } 
    fclose (fp); 
} 

お知らせすることを、あなたはそれをトリミングする必要があるので:ここで私はfgets()を使用してmagazzino項目のリストを読んでいました方法です。また、struct magazzinoをポインタへのポインタ(struct magazzino **)としてこの関数に渡しました。単にポインタとして送信すると、その変数はmain()にあり、リストを作成しても影響を受けません。ここで私はそれのポインタへのポインタにするために、変数のアドレスを渡し、main()からそれを呼ばれる方法は次のとおりです。

struct magazzino *mag; 
read_magazzino(&mag); 

製品を読み取るには、私はfgets()を使用し続けます。各行を読むときに、バッファ内の#文字を調べることができます。その行から製品のフィールドを抽出するには、fscanf()に似ている形式の文字列を受け取るという意味でsscanf()を使用しました。製品名にスペースが含まれていないと仮定すると、これは問題ありません。

void read_prodotto(FILE *fp, struct prodotto **p) 
{ 
    char buf[60]; 
    int finished = 0; 
    while (!finished) { 
     fgets(buf, 60, fp); 
     if (buf[0] != '#') { 
      *p = malloc(sizeof(struct prodotto)); 
      sscanf(buf, "%s%s%d", (*p)->cod_p, (*p)->name, &(*p)->quantity); 
      p = &(*p)->next; 
     } 
     else { 
      *p = NULL; 
      finished = 1; 
     } 
    } 
} 
関連する問題