2016-12-10 11 views
-1

imはこれらの2つのファイルからfile1とfile2を読み込み、2つの変数に情報を保存する際に問題があります。 file1から私はチャンネルの名前を保存したい、そしてfile2から私はユーザーの名前とチャンネルに署名したチャンネルを保存したい。C - ファイルから読み込んで変数に情報を保存する

2つのtypedef構造体(下の図)を作成し、次に2つの変数(下図)を作成し、ファイルを開いてそれらのリストに情報を入れようと考えていました。

私はこのような2D配列を作る別の方法も知っています[100] [100]、これらの両方の解決策の唯一の問題は、 list/arrayにはチャンネルがあります。

これが最善の方法であるかどうかわからない場合や、より簡単で簡単な方法があれば、助けてもらえますか?

これ以上の情報が必要な場合は、ありがとうございます。

Edit1:私は今すぐ持っているfile1コードから読み込んだものを追加しました。これは動作していると思われますが、私の問題/疑問はそれ以上です。またはそれを行うためのより良い/簡単な方法がありますか?ありがとう。

Channel channels[MAX_CHANNELS]; 

Registration registrations[MAX_REGISTRATIONS]; 

typedef struct{ 
    char name_channel[20]; 
    int id; 
} Channel; 

typedef struct{ 
    char username[50]; 
    char name_channel[20]; 
} Registration; 

はFile1:

General 
SO 
PCD 
FBD 

File2の:ファイルを読むため

2016-09-26 14:00:01 paul General 
2016-09-26 14:01:11 mary SO 
2016-09-27 10:33:17 paul SO 
2016-09-27 13:32:10 rachel General 
2016-09-27 13:32:12 rachel FBD 

コード(私はまだFILE1を行っています)。

File *file1 = fopen("channels.txt", "r"); 
    if(file1==NULL){ perror("Reading error: "); exit(1); } ; 

    char line[100]; 
    int i = 0; 
    int w=0; 
    for(w;w<MAX_CHANNELS;w++){ 
     channels[w].id=-1; 
     strcpy(channels[w].name, "n"); 
    } 
    while(fgets(line, 100, file1) != NULL){ 

     printf("Line read: %s", line); 
     line[ strlen(line) -1 ] = 0; 
     Channel a; 
     strcpy(a.name , line); 
     a.id=1; 
     channels[i]=a; 
     i++; 
    } 

    fclose(canais); 
    int k; 
    for(k=0; k<MAX_CHANNELS; k++){ 
     if(channels[k].id!=-1) 
      printf("testing var with channels: %s\n", channels[k].name); 
    } 
+0

- それは古い時代である - しかし、私はFILE2に始まったhaventけれども、私は、FILE1を読み取るためのコードを追加したファイル –

+0

を読み込むためのコードがどこにあるか、私の質問があればでした – GamerGirl

+0

'line [strlen(line)-1] = 0;'行が '\ n''で終わっていなくても' line'を短縮します(最後の行? 。最後の行の問題だけでなく、埋め込まれたヌル文字を扱うまれな行を扱う 'line [strcspn(line、" \ n ")] = = '\ 0'; – chux

答えて

0

(コードコメントで)役立つちょっとしたヒント:私はあなたがそれをやっているようにうまくいくと思います。データをさらに充実させたい場合は、構造体に新しいメンバを追加することができるので、これも拡張可能であると思います。私はstrtokがかなりのデータを解析するのに使われているのを見ました。 Strtokは、改行の仕方によって改行を上書きする必要がなくなります。私は老人になっ可能性があります

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

#define MYSTRINGLEN (50) // In general "magic numbers" 
//in code makes it hard to read, though these are fairly apparent, 
//but try using #define where you can 

typedef struct { 
    char name[MYSTRINGLEN]; 
// int id; 
}Channel; 

typedef struct { 
    char username[MYSTRINGLEN]; 
    char name[MYSTRINGLEN]; 
} Registration; 


int main(int argc, char *argv[]){ 
    int i = 0; 
    //int w = 0; not needed 
    int k = 0; 
    char line[100]; 

    Channel channels[BUFSIZ] = {{{0}}}; // num of brackets depends on num of nested data structure 
    Registration registrations[BUFSIZ] = {{{0}}}; 

/* init all to zero instead w/ bracket syntax 
    for (w = 0; w < BUFSIZ; w++){ 
    channels[w].id = -1; 
    strcpy(channels[w].name, "n"); 
    } 
*/ 
    FILE * file1 = fopen("channels.txt", "r"); 
//Many people use strtok to get done what you are doing here if you are interested 
    while(fgets(line,100,file1)){ // do not need to explicitly state NULL 
    printf("Line read %s\n", line); 
    line[strlen(line) -1] = 0; 
    //Channel a; You have already initialized a whole array of struct, just use them 
    strcpy(channels[i].name, line); 
    //a.id = 1; 
    //channels[i]=a; 
    i++; 
    } 

    fclose(file1); 

    for(k = 0; k < BUFSIZ; k++){ 
    if (0 != channels[k].name[0]){ //can test if string was populated, dont need id flag 
     printf("testing var with channels: %s\n", channels[k].name); 
    } 
    } 

    return 0; 
} 
de here 
関連する問題