1

テキストファイルの内容を構造体にロードしようとしています。

私のアイデアは次のようになります。

2つのファイル、、および1つstruct.hmain.cファイルがありlist.txtます。

ファイル内struct.h

struct analg {
    char word[6];
    char signature[6];
};
struct analg h[106];
FILE *fp;

ファイル内main.c

#include<stdio.h>
#include "struct.h"

void load() {
    fp = fopen("list.txt", "r");
    if(fp == NULL) {
        printf("fail");
        return 1;
    }
    else {
        printf("file loaded!\n");
    }
    fclose(fp);
    return;
}

void print() {

    int i;
    for(i=0; i<1000; i++) {
        while(fgets(h[i].word, 6, fp)) {
            printf("%s", h[i].word);
        }
    }
    return;
 }

int main () {

int choice;

do {
    printf("choose L or P: ");
    scanf("%s", &choice);
    switch(choice) {
        case 'l': 
            load();
            printf("\n[l]oad - [p]rint\n");
            break;
        case 'p': 
            print();
            printf("\n[l]oad - [p]rint\n");
            break;
        default:        
            break;
       }
    }  while(choice!='q');

    return;
}

ファイル内list.txt

throw

timer

tones

tower

trace

trade

tread

そこで、構造体に「L」を押してテキストファイルをロードしようとすると、「p」を押すと表示されますが、表示されません。

4

2 に答える 2

1

あなたのコードが何をしているのかをコメントします:

void load() {
fp = fopen("list.txt", "r"); // opens the file for reading
if(fp == NULL) {
    printf("fail");          // if the file couldn't be opened, return an error
    return 1;                // (aside: a void function can't return an int)
}
else {

   printf("file loaded!\n"); // tell the user that the file was opened
}

fclose(fp);                  // close the file, having read nothing from it

return;
}

ファイルから何も読み取ることは決してありません。したがって、メモリにあるものは、ディスクにあるものとは何の関係もありません。

C には、構造体をシリアライズおよびデシリアライズするための組み込み手段がないため、ディスク上のファイルの正式な文法を定義し、その文法を構造体に解析できるコードを記述する必要があります。

于 2013-02-26T23:09:06.613 に答える
1

あなたのコードには、2 つの潜在的な問題があることがわかります。l選択肢は、またはに基づいて切り替える文字でなければなりませんp。大文字も処理するためにケースを追加する必要がある場合があります。

もう 1 つの問題は、load関数内でファイル ポインターを閉じていることです。したがって、print関数を入力すると、は既に閉じfgetsられているため、機能しない場合があります。fp

ファイルを構造体にロードするには、ロードを次のように変更する必要があります

void load() {
fp = fopen("list.txt", "r");
if(fp == NULL) {
    printf("fail");
    return; // There was an error in original code as this was returning 1
}

do{
    fgets(h[count++].word, 6, fp); // Count is a global variable - no. of elements read
}while(!feof(fp));
printf("file loaded!\n");
fclose(fp);

return;
}

対応する印刷機能は次のようになります

void print(){

  int i;
  printf("Inside print\n");

  for(i=0; i < count; i++) {
      printf("%s", h[i].word);
  }
 return;
 }

主な機能は、

int メイン (){

char choice;


do{
    printf("choose L or P: ");
    scanf("%c", &choice); //Only character is read and hence, %s is not required
    switch(choice){
    case 'l': 
        load();
        printf("\n[l]oad - [p]rint\n");
        break;
    case 'p': 
        print();
        printf("\n[l]oad - [p]rint\n");
        break;
    default:
    case 'q':
        break;
    }
} while(choice !='q');

return 0;
}

最後に 1 点。scanfステートメント ifが採用されている場合、終了scanf("%s", &choice);時に実行時チェック エラーが生成さmainれ、変数 の周りでスタックが破損しているというメッセージが表示されますchoice

于 2013-02-26T23:09:53.303 に答える