• ベストアンサー

ファイルオープンの関数について教えてください。

住所録保守のプログラムの宿題なんですが、ファイルオープンを関数にせずには動かせるのですが、関数にするとエラーが山のようにでます。参考書もよんでるのですがよくわかりません。明日提出なのでよろしくお願いします。                                     関数にする前の考えたプログラムは、                                            struct aaa{ char b                                                       char  c            };                                                         FILE *fp; struct aaa[100]; if((fp=fopen("c:/a.txt","rt"))==NULL) exit(0);です。                                         宿題は f_open(char *name,char *mode) を使って指定されたファイルを指定されたモードで開くという関数を作りなさい。                                                     引数 ポインタ nameはファイル名/mode はオープンモード 戻り値なし という問題です。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.3

「No.2の方への回答に対する補足」を見て、アドバイスをさせていただきます。 エラー原因と解決策としては、以下を参考にして下さい。 1.関数”file_open”内で定義している”fp”は、その関数内でしかアクセスできないのにmain関数からアクセスしている。 -> ”fp”をグローバル変数にする。 (”FILE *fp;”の行を構造体定義の直後に移動する。) 2.main関数から関数”file_open”を呼び出す際のパラメータの渡し方がおかしい。 -> 文字列定数を渡すときはダブルコーテーション("")で囲む。 (c:/a.txt, rt -> "c:/a.txt", "rt") 以上のように変更すればよいと思います。 最後に、少々専門的で申し訳ありません。

haring-haring
質問者

お礼

ありがとうございます。 少し考えてみたら、なんとか糸口がみえてきました。 もう少し考えたらできそうなので・・・ 自分の力でがんばってみたいと思います。

その他の回答 (2)

noname#6581
noname#6581
回答No.2

まぁまずは、そのエラーが山のように出るプログラムをここに書いてください。 そうしないとアドバイスのしようがありません。

haring-haring
質問者

補足

#include<stdio.h> #include<stdlib.h> #define n_max 100 /* 構造体 */ struct aaa{ int b; char c[20]; int d; }; /* ファイルオープン */ void file_open(char *name,char *mode) { FILE *fp; struct aaa x[n_max]; if((fp=fopen(name,mode))==NULL) ; printf("%s がオープンできません。\n",name); exit(0); }; /* ファイル一覧 */ main() { file_open(c:/a.txt, rt); printf("\n\n * 一覧表示 *\n\n"); printf(" ______________________________\n"); printf(" |番号|  氏 名(漢字) |データ|\n"); while(feof(fp)==0) { fscanf(fp,"%d%s%d",&x.a,&x.b,&x.c); if(feof(fp)!=0) break; と途中までですが、根本的に理解できていないので、おかしなことをしているのはわかるんですが、 よろしくお願いいたします。

  • jppy
  • ベストアンサー率14% (14/99)
回答No.1

質問がいまいち・・・ 1.関数にせずには動かせる   ファイルの読み込みができてる? 2.関数にするとエラーが・・・・   成り行きがわかりません とりあえず質問では構造体のメンバ変数宣言には「;」をつけてください。そういうことでもない気もしますが・・・

haring-haring
質問者

お礼

すみません。とりあえず、関数が苦手?というか、 わからないので登録・修正・削除・一覧表示とサブルーチンの部分について作りました。 たぶん、各ルーチンでファイルオープンは共通だから簡単にするために関数にしなさい! というものなのですが(頭が弱くて先生の課題が理解できなくて(@0@)、 教えていただく立場なのに説明がうまくできなくてすみません・・・) とりあえず、自分の作ったプログラムのファイルオープン部分を関数に変えてみようと、 支持があったとおり、f_open(・・,・・)というのを使って関数を作ったのですが、 理解できてないのでファイルオープンができない状態です。よろしくお願いいたします。

関連するQ&A

  • ライブラリ関数について教えてください

    C言語を独学で勉強しています。 ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 しかし、私が作っているプログラムでは表示結果が正しくありません。 char型では==を使って一致かどうかを調べることが出来ないので、ライブラリ関数を使う必要があることを知ったのですが、調べてもよくわかりませんでした・・・ どのように作ればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((test_p->no == f_no) && (test_p->name == f_name)) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); }

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • 作成したプログラムファイルの管理を行うプログラムというものを学校の課題

    作成したプログラムファイルの管理を行うプログラムというものを学校の課題で行っているのですが、 この課題の制作にあたって、手始めにファイルの保存と読み込みを行う関数を作ろうと思うのですが、ファイルを保存する関数(save)と読み込む関数(load)の作り方、ファイルポインタに格納する方法がわかりません。 現在の途中経過を示します。 #include <stdio.h> #include <stdlib.h> struct date {/*作成日付を格納*/ int year;/*年*/ int month;/*月*/ int day;/*日*/ }; struct record {/*レコード*/ char title[30];/*タイトル名*/ char stitle[50];/*副タイトル名*/ struct date adate;/*作成日付*/ char path[50];/*パス名(ファイルがどこのフォルダにあるか)*/ char category[30];/*分類*/ }; int save(struct record file)/*ファイルを保存する*/ { FILE *fp; int c; fp = fopen("program.txt","w"); if (fp == NULL){ fprintf(stderr,"Cannot open file: composition.txt\n"); return -1; } fprintf(""); fclose(fp); } int load(struct record file)/*ファイルを読み込む*/ { } int main() { int num; char file; int sortnum; printf("プログラムファイル管理プログラムへようこそ!\n"); do{ printf("何をしますか?\n"); printf("[0:終了、1:保存、2:読み込み]\n"); printf("入力してください: "); scanf("%d",&num); if(num==1 && num == 2){ printf("ファイル名を指定してください: "); scanf("%s",&file); if(num==1) save(file); if(num==2) load(file); }else printf("入力された数値が正しくありません。\n"); }while(num != 0) return 0; }

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • C++で他のファイルの関数の引数を引きだす方法

    C++初心者です。 あるCプログラムに関数: testFunction(const char x[ ], int a, int b, int c)があり、 この関数はchar y[ ]を戻り値として返します。 次の段階で、別のC++を作成し、その中で、上記testFunctionを呼び出し、 使用している引数を引き出して以降のプログラムで使用する仕様のプログラムを組んでいます。 他のファイルに存在する関数を呼び出す方法は、 std::cout << testFunction(x[], a, b, c) << std::endl; ではないかと思っているのですが、ここから先が進まず困っている状況です。 戻り値だけではなく、引数も呼び出すことは可能でしょうか。 可能であれば、どのようにして呼び出すことができるのでしょうか。 アドバイスをお願いいたします。

  • fread関数でわかりません。

    fread関数で次のようにソースを記述しました。 FILE *fp; char c[10]; int i; fp = fopen ("./aaa.txt", "rb"); fread(c, sizeof(char)-1, 10, fp); for(i = 0; i < 10; i++) printf("%02x ", *(c+i)); fclose(fp); return 0; aaa.txtの中には 0x1~0xAの10個の数字が記入されています。 cをint 型にすると正常に読み込めるのですが、char型だと 01 00 00 00 02 00 00 00 03 00 となってしまい、正常に読み込めません。 どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。 Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか? Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか? //getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。

  • 関数の戻り値がextern

    C言語を、他人のプログラム例を見ながら勉強を始めた者です。 ----- abc.h ----- extern char aaa(); (1) extern char bbb(); (2) ----- abc.c ----- char aaa() { char sw; (3) } char bbb() { char sw; return sw; (4) } Q1. (1)(2)は戻り値が外部変数ということでよいのでしょうか? YESとすれば(4)で自動変数のswが戻り値になっているのは何故でしょうか? Q2. (3)のbbb()では戻り値がvoidではないのに return文がないのは何故でしょうか? 初心者なので質問自体が変だったらスミマセン。

  • c言 ファイルのオープンについて

    #include <stdio.h> int main(void) { int ch; FILE *fp; char fname[64]; printf("ファイル名:"); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL) printf("ファイルをオープンできません。\n"); else{ while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } return(0); } ファイル名は20130603.cで、実行ファイル(exe)と同じディレクトリに入れてあるのに、このプログラムでファイルをオープンできないのです。 このプログラムを実行するために必要なファイルの作成法と、例としてのファイルの内容、実行結果など、教えていただきたいのです。 色々調べてみたのですが、解決法がイマイチ見つかりませんでした。 どうかよろしくお願いします。

  • QNo.4191217 ライブラリ関数について教えてくださいの質問をした者です。

    質問を連投するのは気が引けたのですが、 どうしても分からなかったのでまた質問させてください・・・ ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 前質問で、ライブラリ関数について教えていただき 以下のようにプログラムを作成してみました。 しかし、これだと結果が何も出力されませんでした・・・ 何が間違っていて、どうすればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((strcmp(test_p->no,f_no)==0) && (strcmp(test_p->name,f_name)==0) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); } test.txtの中身 001 akemi 002 kazuo 003 tadashi 005 mika 006 xxx

  • 汎用のファイル読み取り関数について

    ファイルデータを読み取る関数を作成しています. Data *ReadFile (const char *name, Data *data, const char *format, ...) というプロトタイプを考えます. ここでDataはプログラマが自由に定義できる構造体です. この構造体の一例を示すと, typedef struct { int id; /* ID番号 */ char name[32]; /* 氏名 */ char sex; /* 性別 */ int age; /* 年齢 */ char addr[64]; /* 住所 */ } Data; という具合です. 読み取るファイルの書式はプログラムの種類によって 異なりますが, fopen関数やfclose関数を使用するといった 手順は全く同一です. そこで上記のような汎用的な ファイル読み取り関数を書こうと思ったのですが 読み取り部分fscanfの処理をどのように行えばよいか 分かりません. formatで指定する書式は'%'を区切りとする複数の文字列に 分け(例えばformat="%s %d"であればbuffer="%s \0%d\0"), char型のポインタ配列bpで参照できます. 可変引数の部分で 構造体のメンバを指定できるようにしたいのですが... ちなみに呼出側では Data *data; data = ReadFile ("a.txt", data, "%d %s %c %d %s", data->id, ...); というようにしたいと考えています. ソースを以下に示します. どなたかお力をお貸しくださいませ. Data *ReadFile (const char *name, Data *data, const char *format, ...){ FILE *stream; size_t data_size = 1024, buffer_size = 128, bp_size = 16; short i, j, k; char *buffer; char **bp; /* buffer pointer */ va_list ap; /* argument pointer */ (省略) va_start (ap, format); i = 0; k = 0; while (!feof (stream)) { fscanf (stream, bp[i], va_arg (ap, ????)); (省略) } va_end (ap); }