• ベストアンサー

C言語でのファイル操作について(初心者)

hello_worldの回答

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

まぁ書かれている仕様だけならこんな(↓)ところでしょうね #include <stdio.h> #include <stdlib.h> #include <string.h> #define ACTOR_SIZE 100 #define true 1 #define false 0 #define FILE_NAME "foo.txt" typedef struct _Actor { char name; int cnt; } Actor; int RegNo( char name, Actor actor[] ) { int i; for ( i = 0; i < ACTOR_SIZE; i++ ) { if ( actor[i].name == 0 ) break; if ( actor[i].name == name ) return i; } if ( i == ACTOR_SIZE ) exit( 0 ); actor[i].name = name; actor[i].cnt = 0; return i; } int main() { Actor actor[ACTOR_SIZE]; char name; int index1, index2; FILE *fp; memset( actor, 0, sizeof( actor ) ); while( true ) { printf( "あげた人:" ); name = getchar(); getchar(); index1 = RegNo( name, actor ); actor[index1].cnt++; printf( "もらった人:" ); name = getchar(); getchar(); index2 = RegNo( name, actor ); actor[index2].cnt--; fp = fopen( FILE_NAME, "a" ); if ( fp == NULL ) exit( 0 ); fprintf( fp, "あげた人:%c もらった人:%c %c=%d\n", actor[index1].name, actor[index2].name, actor[index1].name, actor[index1].cnt ); fclose( fp ); } return 0; } プログラム中の細かいエラーチェックなどは自分で付け足してください。 ただ仕様としては足りない所がまだあって、 ・同一人物間の飴玉のやり取りは成立するのか ・カウンタのディフォルト値が無いので0にしたが、カウンタが0の人は飴玉が貰えるのか(そもそもこれが成り立たないとプログラムは開始できませんが…) ・名前の長さは良いとしても登場人物の人数制限は? さらに書けば「ファイル操作について教えて欲しい」とありますが、ファイル操作の何が判らないのですか?

zunzunzunzunzun
質問者

補足

貴重な時間をありがとうございます。上記のプログラムで自分がやりたいことはなんとか出来そうです。 説明が未熟でもうしわけありません。 実際に自分が作りたいプログラムはイーサネットから送信元IPアドレスと送信先IPアドレスを取得し、送信元、送信先IPアドレスを登録、そして送信先IPアドレスのカウンタを1つ増やす所まではいいんですが、そのあと、送信先IPアドレスから送信元IPアドレスを検索してそのアドレスからカウンタを1つ減らすというプログラムを作ろうと考えています。 ファイル操作について教えて欲しいと書いたのは登録した後、ファイルを読みこみ送信先IPアドレスから送信元IPアドレスを検索、そしてカウンタを1つ減らすというファイル操作の仕方が分からなかったので質問させて頂きました。

関連するQ&A

  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • C言語 複数ファイル操作について

    Cプログラミング初心者です。 論文などの何行も文章があるようなテキストファイル(ここでは1.txtとします)と、他に予め単語をいくつか登録しているテキストファイル(2.txt)を開き、1.txtを最初の行から一行ごとに読み込み、2.txtの中にある単語が1つでもその一行の文章中に含まれていたらその一行の文章を出力し、また次の行においても2.txtの中にある単語のいずれかが含まれているかどうかを調べて含まれている場合は出力…含まれていない場合は出力せずに次の行へ…といったようにこれを1.txt内の最後の行まで繰り返し行うプログラムを作りたいのですが、自分が作ったプログラムでは含む・含まない関係なく1.txt内の文章全てが出力されてしまいます。おそらく最初のwhile文あたりがおかしいのだろうという予想はつくのですがどのように直せばよいのかわからず悩んでいます。どなたか教えていただければ嬉しいです(;_:) #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = s1; p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); } } int main(void){ FILE *fp; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); scanf("%s", fname);   ←ここで1.txtを入力するとします fp = fopen(fname, "r"); while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); memset(str1, 0, N); fread(str1, 1, N-1, fp); if((fp = fopen(filename, "r")) == NULL){ fprintf(stderr, "%serror.\n", filename); exit(EXIT_FAILURE); } while(fgets(str2, N, fp) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ a = 1; printf("%s\n", str1); break; } } if(a==0){ return 0; } fclose(fp); } return EXIT_SUCCESS; }

  • Visual C++ 2008 でのファイル操作

    現在VisualC++2008 でプログラムの拡張子を.cでプログラミングをしています。 Cの教科書で書いてある FILE *fp; fp=fopen(" ","r"); として fprintf(fp," "); としてエラーがでます。 どのようにすればファイル書き込みができるのでしょうか?

  • C言語のファイル入出力について

    for文の中でファイルの入出力をファイル名を変えながら行うことはできますか?作成したいプログラムは以下の通りになっています。 よろしくお願いします。 #include<stdio.h> main() { int i; FILE *fp; for(i=0;i<10;i++) {  fp=fopen("ココにiの値を入れたい.txt","w");  fprintf(fp,"%d\n",i);  fclose(fp); } return(0); }

  • C言語 ファイルの読み込みについて

    以下のようなプログラムを実行します \nで改行が行われません。なぜでしょうか? #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("arm_x.csv","r"); while(1) { fscanf(fp,"%lf%lf\n",&a,&b); printf("%f::%f\n",a,b); count++; if(count==10)break; } fclose(fp); } csvファイルは 0.0 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5・・・ 0.2 0.3 0.4・・・・・・・・・ : : です。 実行結果はこのようになってしまいます。 0.0 0.1 0.2 0.3 0.4 0.5 : :

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • C言語でファイルから読み込みができません。

    以下のプログラムを実行すると よくわからない値が返ってきます。 なぜでしょうか?教えてください。 #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("test.xls", "r"); while(1) { fscanf(fp, "%lf %lf\n", &a, &b); printf("%f, %f\n", a, b); count++; if(count==10)break; } fclose(fp); } test.xlsの中身は 1.0 2.0 3.0 4.0 5.0 6.0   :   :   :   : です。 よろしくお願いします。

  • C言語で.pgmの画像を作り、見る

    Windows10のコマンドプロンプト上でC言語を使って.pgmの画像を作り、見ることができないので質問します。 以下のソースコードを実行してつくった。out.pgmファイルをGIMPとirfanviewというソフトを使ってみようとしましたが、GIMPはPNM 画像 エラーメッセージ 不正なファイルですと返し、irfanviewは invalid or unsupported PNMファイルと返し、何も表示されませんでした。 #include<stdio.h> int main(void){ FILE *fp; fp=fopen("out.pgm","wb"); fprintf(fp,"P5\n"); fprintf(fp,"#Image\n"); fprintf(fp,"256 256\n"); fprintf(fp,"255\n"); for(int i=0;i<256;i++){ for(int j=0;j<256;j++){ fwrite(&j,sizeof(unsigned char),1,fp); } } fclose(fp); return(0); } どなたかC言語で.pgmの画像を作り、見る方法を教えてくださいお願いします。

  • C言語に関する質問です。

    以下のプログラムはどこか間違っていますか?エラーが出ます。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラー csvyomikomi.c: In function ‘main’: csvyomikomi.c:10:5: warning: assignment makes pointer from integer without a cast [enabled by default] fp = fileopen(filename,"r"); ^ /tmp/ccMQWsTE.o: 関数 `main' 内: csvyomikomi.c:(.text+0x21): `fileopen' に対する定義されていない参照です csvyomikomi.c:(.text+0x8d): `fileclose' に対する定義されていない参照です collect2: error: ld returned 1 exit status ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ソース #include <stdio.h> #include <stdlib.h> int main(void){ int a,b,c; char *filename="data01.dat"; FILE *fp; fp = fileopen(filename,"r"); if (fp == NULL){ fprintf(stderr,"%sのオープンに失敗しました。\n",filename); exit(1); } //csvファイルの読み込み fscanf(fp,"%d,%d,%d",&a,&b,&c); fileclose(fp); printf("%d,%d,%d\n",a,b,c); return 0; }