• ベストアンサー

union共同体の使い方…

typedef union {  A_FILE* aFile;  B_FILE* bFile; }C_FILE; 上記のようにunion共同体で2つの型を 対応するものを作りました。 ファイルをオープンするのに C_FILE file_Open( const char *filename); というI/Fを作りました。 でもファイルをクローズする時に ファイルハンドルを渡そうと思うのですが、 ファイルハンドルの引数をどっちの型が入っても よいようにしたいのですが。 int file_Close(C_FILE.aFile Fp) ←これでは意味がない… int file_Close(C_FILE Fp)  ←こういう使い方は出来ませんよね? ファイルオープン側に実体を持ったままで、 どっちの型が入ってもよいファイルクローズを行う I/Fを作るのは無理なのでしょうか。 やはり実体は呼びだす側にあるべきなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

unionってなんでもかんでも同じメモリ領域にガンガンいれる為のものです。 目的は容量節約であったり、ほかの型の物を参照したいときに使ったりします。 araponさんはオーバーロード的な使い方をしたいようですが、基本的にそれは無理です。 #プリプロセッサをうまく使えばできるかもしれませんが、 #返ってソースが汚くなるかと >I/Fを作るのは無理なのでしょうか。 >やはり実体は呼びだす側にあるべきなのでしょうか? メンバにA_FILEであるかB_FILEであるかの情報を もたす必要があると思います。

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

参考までにお聞きしたいのですが、 A_FILE* aFileとB_FILE* bFile; では、なにが違うのでしょうか? A_FILEとB_FILEとに分ける理由を説明していただけませんでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 と同じですが, 結局 A_FILE か B_FILE かを区別するのにメンバが 1つ必 要なので, struct を使って typedef struct { int type; union { A_FILE *a_file; B_FILE *b_file; }; } C_FILE; くらいかな? 無名 union が使えなかったら, 適当に名前を付けてやってくだ さい.

関連するQ&A

  • 2バイト読飛ばして、スペースに置き換えたいです

    Cで、改行がないテキストファイルを800バイト毎に改行を入れることは無事できたのですが、254バイト目と255バイト目に化けている文字があり、それを半角スペース2つに置換したいのですがどうすればよいでしょうか? #include <stdio.h> int main() { FILE *f1,*f2; int i=0; char c; f1 = fopen("afile.txt", "r"); f2 = fopen("bfile.txt", "w"); if (f1 && f2) { while(!feof(f1)) { fscanf(f1, "%c", &c); fprintf(f2, "%c", c); i ++; if (i == 800){ i=0; fprintf(f2, "\n"); } } fclose(f2); fclose(f1); } }

  • main関数の中をスッキリさせたくて

    main関数をスッキリさせたくて、関数化してみたのですが、objファイルまではできるのですが実行ファイルができません。 エラー内容ですが、下のようにでます。 /* test_2.c(9) : error C2440: '関数' : 'FILE' から 'FILE *' に変換できません。 test_2.c(9) : warning C4024: 'read_f' : の型が 1 の仮引数および実引数と異なります。 test_2.c(10) : error C2440: '関数' : 'FILE' から 'FILE *' に変換できません。 test_2.c(10) : warning C4024: 'output_f' : の型が 1 の仮引数および実引数と異なります。 */ 書き方が間違ってるとは思うのですが、どこをどう直せばいいかわかりません。 教えてください。 #include <stdio.h> #include <stdlib.h> void read_f(FILE *f_p); void output_f(FILE *f_p); int main(void){ FILE *fp; read_f(*fp); output_f(*fp); fclose(fp); return 0; } void read_f(FILE *f_p){ int fn=0; char f_name[256]; printf(" text number 1, 2, 3, 4 : "); scanf("%d",&fn); sprintf(f_name,"map%d.txt",fn); if((f_p=fopen(f_name,"r"))==NULL){ /*f_nameを " " で囲まない!*/ printf("You will not be able to open the file\n"); exit(1); } } void output_f(FILE *f_p){ int i,j; int array[10][10]; for(j=0;j<10;j++){ for(i=0;i<10;i++){ fscanf(f_p,"%d",&array[i][j]); //画面表示 10*10 } printf("%d",array[i][j]); } printf("\n"); }

  • CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後

    CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後平均値を求めて構造体のメンバ、"ave"に格納し表示させたいのですが、読み込み格納している最中で、セグメンテーション違反で終了してしまいます。どなたかよろしければ教えて頂けないでしょうか。 プログラム ************************************************** #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME_00 "f_00_01.CSV" struct Data{ double value; double ave; }; int main(int argc, char *argv[]) { FILE* fp,*fo; // ファイルポインタ用 int n, i, file_size; struct Data *dat; if ((fp = fopen(FILE_NAME_00,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; for(i=0;i<file_size;i++){ fscanf(fp,"%lf",&dat[i].value); printf("%lf\n",dat[i].value); i++; } fclose(fp); printf("\n"); free(dat); return 0; } *************************************************** f_00_01.CSV *************************************************** 2.313725 2.312810 2.314031 2.316167 2.315557 2.313725 . . . . . ***********************************************

  • CSVファイルの内容を構造体に格納したい(Unix使用)。

    こんにちは。私は30代の男性です。 「名前」「身長」「体重」が記載されたCSVファイルの内容を読み取って、構造体の「name」「height」「weight」に格納するプログラムを作っています。CSVの内容は A,175,80 B,167,89 C,155,45 ・ ・ ・ Z,188,70 だと仮定します。数値が読み取れているか、下記のように「tp = strtok(file_image, ",\n" );」の前後に「printf("%s\n", file_image);」を置いてみたら、strtok前では全て表示されるのに、strtok後では「ABC」しか表示されません。これでは全てのデータを構造体に格納できないので、困っています。 1.どのようにすれば、数字も取り出せる(読み取れる)でしょうか? 2.効率よく構造体に格納するには、どのようにしたらよいでしょうか? アドバイスを頂ければ幸いです。宜しくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp = NULL; int rtn = 0; if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルオープンに失敗しました。\n"); return 1; } if (argc != 2) { printf("ERROR: オプションの数に過不足があります。\n"); return 1; } rtn = change_csv(fp); return 0; } int change_csv(FILE *fp) { int i; int j; char file_image[256]; /* 読み込んだ先のメモリの領域 */ char *tp; for (i = 0; i <= 256; i++) { if (fgets(file_image, 256, fp) == NULL) { if (ferror(fp) != 0) { printf("ERROR: 読み込みに失敗しました。\n"); return 1; } } if (feof(fp) != 0) { break; } printf("%s\n", file_image); tp = strtok(file_image, ",\n" ); printf("%s\n", file_image); } fclose(fp); return 0; }

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

  • ファイルへの書き込みについて

    はじめまして、よろしくお願いします。 <質問>C言語を使用したプログラミングで、     下記ソースのように、     ファイルへ書き込むことは可能であればご指摘お願いします。     ※上手に値が渡せていないようで、      実行すると不正な処理?で落ちてしまいます。 <書き込む方法>     1)メインプログラムで書き込むファイルのOPEN     2)サブプログラムで処理を行いファイル書き込み(1)       サブプログラムで処理を行いファイル書き込み(n)     3)メインプログラムで書き込んだファイルをCLOSE <イメージ> #include <stdafx.h> #include <stdio.h> void sub( int i, FILE *fp ); int main(){ FILE *fp; fp = fopen("c:\\0511.txt","w"); int i; for( i = 1; i < 100; i++ ){ sub( i, fp ); } fclose(fp); } void sub( int i, FILE *fp ){ char moji[2]; sprintf(moji,"%3d",i ); fprintf(fp,"%s",moji ); } <補足>VC++2005 ExpressEdition でビルドは出来ました。 お手間おかけしますが、よろしくお願いします。

  • C言語による構造体の値渡しについて

    以下プログラムを作成しました。 1.read_file関数によりファイルを読み込み。 2.avg_kokugo関数により、国語の平均点を出す。 という流れで組まれているのですが、 1.read_file関数実行時に、dat構造体を渡しています。 2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。 ここで、疑問なのが、 「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、 「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」 本を参考にして勉強していたのですが、 「構造体は、値渡しの時に読み込みはできるが、更新はできない」 と書かれていたのです。(ポインタ参照渡しの時は可能。) なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか? 更新と新規格納は意味が異なるからなのでしょうか? ご教授よろしくお願いします。 <ソース> #include <stdio.h> //グローバル #define FNAME "test.txt" struct score{ char name[20]; int kokugo; int sansu; }; int read_file(struct score dat[],int n); float avg_kokugo(struct score dat[],int n); int main(void){ struct score dat[3]; int ret; float kokugo; float sansu; ret= read_file(dat,3); if(ret <0){ return 0; } kokugo = avg_kokugo(dat,3); printf("国語の平均 %.1f\n",kokugo); return 0; } int read_file(struct score dat[],int n){ FILE *fp; //ファイルポインタ int i; fp=fopen(FNAME,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return -1; //-1によるプログラム強制終了 } //データ読み込み i=0; //datに保存していく。 while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){ i=i+1; //ファイル件数読み込み } fclose(fp); return 0; } float avg_kokugo(struct score dat[],int n){ int sum; //合計 float answer; int i; sum=0; for(i=0;i<n;i++){ sum = sum + dat[i].kokugo; } //平均点を求める answer =(float)sum / (float)n; return answer; }

  • VBAとC言語でwavファイル再生

    VBAとCのプログラムについてどなたかアドバイスしていただけませんか? 特定のcsvファイルに1が入ったら指定のwavファイルを再生させるプログラムを作りたいのですが、 どうしてもエラーになってしまいます。 (必ずどこかのcsvに1が入り、その他のcsvには0が入るようにしています。) 以下にVBAとCのプログラムを載せます。 ちなみに、VBAはopen1と同様の内容をopen10まで行い、read1も同様にread10まで行います。 Sub open1() Dim buf As String Open "C:\Users\Documents\Debug\file1.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf Cells(1, 1) = buf Open "C:\Users\Documents\Visual Studio 2008\Projects\PlaySound\Debug\1.csv" For Output As #2 Print #2, buf Close #2 Loop Close #1 End Sub Sub read1() Dim FlNum As Long, FlName As String, Atai As Variant FlNum = FreeFile FlName = "C:\Users\\Documents\Debug\file1.csv" Open FlName For Output Access Write As #FlNum Atai = Range("A1") Print #FlNum, CStr(Atai) Close #FlNum End Sub これでcsvの内容をコピーさせています。 そして、Cのプログラムが以下です。 #include "stdafx.h" #include <windows.h> #include <mmsystem.h> #include<stdio.h> #include<time.h> #include<windows.h> #pragma comment (lib,"winmm.lib") FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; FILE *fp5; FILE *fp6; FILE *fp7; FILE *fp8; FILE *fp9; FILE *fp10; int _tmain(int argc, _TCHAR* argv[]) { //引数 int s; int t; int u; int v; int w; int x; int y; int z; int z1; int z2; //回数表現 int a=1; int b=1; int c=1; int d=1; int e=1; int f=1; int g=1; int h=1; int h1 = 1; int h2 = 1; while(1){ Sleep(2000); fp1 = fopen("1.csv","r"); fp2 = fopen("2.csv","r"); fp3 = fopen("3.csv","r"); fp4 = fopen("4.csv","r"); fp5 = fopen("5.csv","r"); fp6 = fopen("6.csv","r"); fp7 = fopen("7.csv","r"); fp8 = fopen("8.csv","r"); fp9 = fopen("9.csv","r"); fp10= fopen("10.csv","r"); printf("finish to open csv file\n"); fscanf(fp1,"%d",&s); printf("finish to scan file1.csv %d\n", &s); fscanf(fp2,"%d",&t); fscanf(fp3,"%d",&u); fscanf(fp4,"%d",&v); fscanf(fp5,"%d",&w); fscanf(fp6,"%d",&x); fscanf(fp7,"%d",&y); fscanf(fp8,"%d",&z); fscanf(fp9,"%d",&z1); fscanf(fp10,"%d",&z2); printf("finish to scan csv file\n"); if(s==1&&a==1){ ::PlaySound(_T("what.wav"),NULL, SND_FILENAME); b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1; h1 = 1; h2 = 1; a++; } (同様にif文がcsvのそれぞれにつきあるのと、fcloseもありますが、省略します。) ビルドは正常終了するのですが、デバッグすると以下のエラーメッセージが出ます。 Debug Assertion Failed! Proogram:...\Debug\PlaySound.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\fscanf.c Line:52 Expression:(stream != NULL) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) 中止(A)再試行(R)無視(I) 試しにDebugフォルダにできた実行ファイルを開くと printfできちんと出力もできてますし、 csvファイルもきちんと出力できています。 wavファイルを再生させるにはどうしたらいいでしょうか。

  • C言語 共用体の構造体の引数設定

    共用体と構造体のファイル入出力の問題で、共用体の中の構造体を引数にしたいのですが、 設定方法が分からずにずっと悩んでいます。ご教授いただきたく、お願いいたします。 下記のまま、union *tbl で指定してあげることは出来たのですが、tbl.COM でやりとりすることは出来ないのでしょうか? 呼ぶ側:  &tbl.COM 呼び出す側:union *tbl.COM では出来ませんでした。他にもいろいろ試しましたが、全てコンパイルエラーになってしまいます。 どちらもアドレスが同じ場合は出来ないということでしょうか?それとも私の指定の仕方がおかしいのでしょうか? ※全コードが長いため、簡単に書いてありますので、このままだとエラーになるかもしれません。 struct COM_DATA{ char tblName[4]; short comLen; }; struct INDI_DATA{ short No; short Fum; }; union TBL{ struct COM_DATA COM; struct INDI_DATA INDI; }; int FileWrite( union *tbl ); main() { union TBL tbl; if( ( FileWrite(tbl) ) == NG ) { exit(1); } } /* 1レコード分、ファイルを書き込む関数 */ int FileWrite( union *Tbl ) { FILE *fp; if( ( fp = fopen( "aa.dat", "w" ) ) == NULL ) { printf( "%sのfopen error!\n", F_Name ); return NG; } if( ( fwrite( &tbl, 16, 1 ,fp ) ) != 1 ) { printf( "%sのfwrite error!%d\n", F_Name ); return NG; } fclose(fp); return OK; }

  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

専門家に質問してみよう