C言語でファイルを表示させるプログラミングがわかりません。

このQ&Aのポイント
  • ファイルを開いて内容を表示するC言語のプログラムがわかりません。
  • 複数人のデータを入力し、ファイルに記録する方法がわかりません。
  • C言語でのファイル操作の基本がわかりません。
回答を見る
  • ベストアンサー

C言語でファイルを表示させるプログラミングがわかりません。

以下のC言語のプログラミングがわかりません。どなたかわかりませんか? ファイルdata.txtに人の名前と生年月日を追記し、ファイルをいったん閉じてから開きなおし、ファイルの内容を表示するプログラムを作成する。 同じプログラムを2度実行すると、前に入力したときの人の名前と生年月日も表示されるようになる。 複数人のデータが連続して入力できるように工夫する。形式は以下のようにスペースとコンマで区切って記録する。(文字列の後ろにはスペースを入れるように注意する。) Taro , 1985, 6,23 Jiro ,1983, 7,31 そして、 半角の名前と 生年月日(三つの数字)がコンマで区切って各人に対してファイルに記録できるようにする。 一人分のデータが一行で記録されている。 1回の実行で,複数人のデータを連続して入力できる。 全然わからなくて以下のようなことしかできませんでした。 #include<stdio.h> int main() { char name[20]; int i,j,k; scanf("%s ,%d, %d, %d", name, &i, &j, &k); printf("%s ,%d, %d, %d", name, i, j, k); }

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

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

ざっと書いてみましたので、参考にしてください。 scanf("%s,%d,%d,%d" , name , &year , &month , &day); とせずに、名前と生年月日の入力をわけたのは、 一緒にしてしまうと、 例えばtarou,2007,1,1と入力した時に、 それが全てnameに格納されてしまい、 year,month,dayにゴミが入ってしまうためです。 どうしても一緒に入力したいのであれば、 scanf("%d,%d,%d,%s" , &year , &month , &day , name); の順で入力させるか、或いは scanf("%s" , buf); として一旦全て別のバッファに格納した後、それを解読するような手法をとることになるかと思います。 例えばstrtokという関数がありますので、その利用を考えてみてください。 #include <stdio.h> #include <stdlib.h> const static int TRUE = 1; const static int FALSE = 0; const static int BUFSIZE = 1024; const static char* DATAFILE = "data.txt"; int open_file(FILE** , const char * const , const char * const); void read_data(void); void write_data(void); int main(void) { read_data(); write_data(); return 0; } /* ファイルを開く 引数 fp ファイルポインタへのポインタ fname ファイル名 mode ファイルを開く際のモード 戻り値 オープン成否 */ int open_file(FILE** fp , const char * const fname , const char * const mode) { FILE* f; f = fopen(fname , mode); if(f == NULL) { fprintf(stderr , "cannot open file %s with mode %s\n" , fname , mode); return FALSE; } *fp = f; return TRUE; } /* あれば、DATAFILEを読む 無ければ何もしない */ void read_data(void) { FILE* fp; if(! open_file(&fp , DATAFILE , "r")) { return; } char buf[BUFSIZE]; while((fgets(buf , BUFSIZE , fp)) != NULL) { printf(buf); } fclose(fp); } /* ユーザに入力を求め、ファイルへ出力 */ void write_data(void) { FILE* fp; if(! open_file(&fp , DATAFILE , "a")) { fprintf(stderr , "error in write_data.\n"); exit(EXIT_FAILURE); } while(TRUE) { char name[BUFSIZE]; int year , month , day; // 氏名の入力 printf("name (for exit, enter 'quit')> "); scanf("%s" , name); if(strncmp(name , "quit" , 4) == 0) { break; } // 生年月日の入力 printf("birthday > "); scanf("%d,%d,%d" , &year , &month , &day); fprintf(fp , "%s,%d,%d,%d\n" , name , year , month , day); } fclose(fp); }

bad-pc
質問者

お礼

ご回答ありがとうございました。 でも、エラーが出てしまうんですが、どう直せばいいのでしょうか?

その他の回答 (4)

noname#119918
noname#119918
回答No.5

ソースコードの以下の部分を見てください。 printf("name (for exit, enter 'quit')> "); scanf("%s" , name); if(strncmp(name , "quit" , 4) == 0) { break; } 氏名の入力を要求する部分ですが、 氏名としてquitを入力すると、 無限ループを脱出してプログラムが終了するようになっています。

noname#119918
noname#119918
回答No.4

* 1番目と2番目の警告について ソースコードがCではなく、C++として、認識されているようですね。 C++では、通常、入出力処理はprintf,scanfではなく、ストリームを用いて行いますので、 それについての警告かと思います。 VCは使わないので、推測になってしまいますが、 ファイルの拡張子が.cppになっていませんか? ファイルの拡張子を.cにしてコンパイルしなおすと良いかと思います。 * 3番目のエラーについて 冒頭に #include <string.h> を追加してみてください。 strncmp関数を宣言している標準ヘッダファイルです。 strncmp関数はquitと入力された時にプログラムを終了するために 利用しているだけなので、別の手段でプログラムを終了するならば、 削ってしまってもOKです。

bad-pc
質問者

お礼

冒頭に#include <string.h>をいれたら実行できたのですが、名前を生年月日を永遠に入れ続けるだけで終わらないのですがどうすればいいでしょうか?

noname#119918
noname#119918
回答No.3

>ご回答ありがとうございました。 >でも、エラーが出てしまうんですが、どう直せばいいのでしょうか? これは失礼を致しました。 コンパイルエラーでしょうか、それとも実行時のエラーでしょうか。 どちらにせよ、エラー時のメッセージなど提示していただければ、 回答者としての責任がありますので、修正します。

bad-pc
質問者

お礼

コンパイルで以下のようなものが出てしまいました。 8.cpp(32) : warning C4996: 'fopen' が古い形式として宣言されました。C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(234) : 'fopen' の宣言を確認してください。 8.cpp(78) : warning C4996: 'scanf' が古い形式として宣言されました。C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(295) : 'scanf' の宣言を確認してください。 8.cpp(79) : error C3861: 'strncmp': 識別子が見つかりませんでした ビルドログは "file://c:\Users\ユーザー\Documents\Visual Studio 2005\Projects\kadai8\Debug\BuildLog.htm" に保存されました。 - エラー 1、警告 2

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

ヒントだけ それぞれの処理は 作れてるのかな? ・ファイルdata.txtに人の名前と生年月日を追記 ・ファイルをいったん閉じて開きなおし ・ファイルの内容を表示する ・連続して入力 ・各人に対してファイルに記録 (全部文中から抜粋) 最低でもこれらが単品で作動する物を作れないとアウト

関連するQ&A

  • C言語のプログラミングについて質問です。

    以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。 仕様は以下に記載します。 入力:__、__、__、__、__EnterKeyで結果を表示。 以下のバブルソートの文のどこをいじれば良いでしょうか? 返答宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int work; int j; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /* printf("k=%d\n",k); for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } */ //バブルソート//     for(i=0; i<k-1; i++) { if(val[i] < val[i+1]) { } else{ work = val[i]; val[i] = val[i+1]; val[i+1] = work; } } for(i=0;i<k;i++) { printf("出力 = %d\n",val[i]); } }

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

  • C言語を使用したプログラミング方法で質問です。

    以下の処理にバブルソートで小さい順からの比較結果をprintfで出力したいのですが、どこにバブルソートを追加すればよろしいですか? 追加した文を教えて頂けますか? 今は値を16進数から10進数に変換した数字を出力しているが、これを小さい順に出力したいんです。 宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /*printf("%d\n",k);*/ for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } }

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • C言語のファイル読み込み

    あるcsvファイルがあり、それは以下のように(規則性のない)波形のデータです。 0.001 0.14 0.002 0.32 0.003 0.46 ・ ・ 2.000 0.22 左側がx軸、右側がy軸で、データはそれぞれ2000個あります。 このデータ(波形)をC言語のプログラムに読み込ませるにはどうしたらいいのでしょうか? #include <stdio.h> int main(void) { double i,j; FILE *file; file = fopen("sample.csv","r"); fscanf(file,"%ls,%ls",&i,&j); fclose(file); printf("i = %d : j = %d\n",i,j); return 0; } とすれば最初の1行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • scanf C言語

    現在取得したデータを多次元配列いれたいのですが、カンマまでの文字列を入れる方法がわかりません。例で言いますと jgasogasog,dklafh343,fdjalsjfd,kldjfas5 dfasfdas6ff ,fsadfa6sg,dgas6dsa,fsdafa もカンマまでの文字列array[0][0] = jgasogasog array[0][1] = dklafh34 といった形で入れていきたいです。 ご迷惑おかけしますが何卒よろしくお願いします。 途中まで作ったソースをのせます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 2 #define hoge 1400 int main(void) { FILE *fp; char test[10][500]; int n = 0; if ((fp = fopen("testfile.csv", "r")) == NULL) { printf("\aファイルをオープンできません\n"); return(0); } int i, j; int k = 0; //ファイルfpの終端指示子をチェックします。 while (!feof(fp) && k < 500) { //%cは一文字出力をしてくれる使用データ型はchar型 //fscanf関数は書式指定をしてファイルから値を読み込み、バッファに格納します。 for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { fscanf(fp, "%[^,],%d", &test[i][j]); k++; } } } for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { printf("test[%d][%d]=%d\n", i,j,test[i][j]); } } fclose(fp); return(0); } 似たような質問をしてすいません。

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }