• ベストアンサー

ファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。 返答のほどよろしくお願いいたします。 include<stdio.h> #define SIZE 20 void main(void) { char c[SIZE], *p; FILE *fp; fp = fopen("data.txt","w+"); p = c; while(gets(c) != NULL){ fputs(p,fp); } fclose(fp); printf("data.txtへ出力しました\n"); }

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

  • ベストアンサー
  • catby
  • ベストアンサー率65% (50/76)
回答No.3

一語一語ってのは、1回の入力毎って事でしょうか? とするならば、これでどうでしょうか? #include <stdio.h> #define SIZE 20 void main(void) {   char c[SIZE], *p;   FILE *fp;      fp = fopen("data.txt","w+");   p = c;   while(gets(c) != NULL){     fputs(p,fp);     fputc('\n', fp);   }      fclose(fp);   printf("data.txtへ出力しました\n");    }

yukikundesuyo
質問者

お礼

返答ありがとうございます。私も考えたらこのやり方にぶち当たりました。

その他の回答 (3)

  • ency
  • ベストアンサー率39% (93/238)
回答No.4

素直に fprintf() を使ってみてはいかがですか? あと、細かいところをいうと、main() 関数は戻り値が int です。 それから、今後のことを考えると gets() よりも fgets() を使う習慣をつけておいた方が良いと思います。 gets() だとサイズの指定ができないため、用意している領域サイズ以上でも読み込んでしまいます。 バッファオーバランというバグを仕込んでしまうことになります。 fgets() だとサイズの指定ができるため、指定サイズ以上読み込むことはありません。 この例の場合だと、最大19文字まで読み込み、終端の '\0' は勝手につけてくれます。 あ、そうか。 gets() と違って、fgets() は改行を捨てないので、今回の場合はそのまま表示すれば良いのか。。。 …ま、そんな偶然もあります。 ------------------------------------------------ #include<stdio.h> #define SIZE 20 int main(void) { char c[SIZE], *p; FILE *fp; fp = fopen("data.txt","w+"); p = c; while(fgets(c,SIZE,stdin) != NULL){ /* fgets() の場合、改行は残るので p のみ表示 */ fprintf(fp,"%s",p); } fclose(fp); printf("data.txtへ出力しました\n"); return 0; } ------------------------------------------------ やりたいことは、こんなことで良いですか?

yukikundesuyo
質問者

お礼

返答ありがとうございます。fprintf() の使い方が分かり勉強になりました。やりたいことはNo3のような方法です。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.2

一語一語って ABC なら A\nBA\nCA\n ってことですか? int i; char cOut[2]; while(gets(c) != NULL){ for(i = 0; 0 < strlen(c) ; i++) { cOut[0] = c[i]; cOut[1] = 0x00; fputs(cOut,fp); } } でどうでしょうか (全角を考慮していません あしからず)

yukikundesuyo
質問者

お礼

返答ありがとうございます。私はANo.3のやり方を求めていました。

回答No.1

なにをもって'語'としますか? '語を区切るもの'はなんですか? 読み込んだ文字列をアタマから検索し、'語を区切るもの'を見つけて改行に置き換えてから出力すればいい。

関連するQ&A

  • fprintfで出力するファイルのパス指定について

    cで以下のコードを書いています。 file.txtを任意の場所に作りたいのですが どうすればいいのでしょうか。 fopen("c:\file.txt", "r"))と書くとエラーになって しまいました。 void main(void) { FILE *fp; if ((fp = fopen("file.txt", "r")) == NULL) { fprintf ( stderr, "err\n" ); exit (2); } fprintf(fp,"%s\n",a);; fclose(fp); }

  • 直接ファイルへ出力できるものでしょうか?

    構造体 struct{int i,int m}i を用意しています #include <stdio.h> typedef struct{ int i[6]; /*学生番号*/ int m[6]; /*身長*/ }stu int main(void){ FILE *fp; stu s; fp("text.txt","w"); while(gets(s)!=NULL){ fputs(s,fp); } fclose(fp); } これを動かそうと思ってもダメなのは自分でもよくわかります。 構造体へダイレクトにいれてファイル出力というのは無謀なのでしょうか? 一度構造体にきちんと取り込んだ後で改めてファイルへ出力するのが正式なのでしょうか? 教えてください

  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

  • 複数ファイルの出力

    質問があります。1600個のデータを読み込んで(16個ずつの組で100組)、1番目、3番目、5番目、7番目のデータをss[1].txtとして出力し、同様に2番目、4番目、6番目、8番目のデータをsk[1].txt、9番目、11番目、13番目、15番目のデータをks[1].txt、10番目、12番目、14番目、16番目のデータをkk[1].txtとして出力させます。以下、ss[2].txt,sk[2].txt,ks[2].txt,kk[2].txt・・・に関してはそれぞれ直前のファイルに16を足したデータ(例えばss[2].txtなら、17番目、19番目、21番目、23番目のデータを出力)を出力させるというプログラムです。 以下に自分で作ったプログラムを掲載します。 void ecg_rr(fp,data_max) FILE *fp; { int i,j=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i,j=0;i<100,j<100;i++,j++) { sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0+j*16]); fprintf(fp,"%8.8f\n",data[0][2+j*16]); fprintf(fp,"%8.8f\n",data[0][4+j*16]); fprintf(fp,"%8.8f\n",data[0][6+j*16]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1+j*16]); fprintf(fp,"%8.8f\n",data[0][3+j*16]); fprintf(fp,"%8.8f\n",data[0][5+j*16]); fprintf(fp,"%8.8f\n",data[0][9+j*16]); fclose(fp); /*ks,kkに関しても同様*/ } } これだと100個ずつファイルを出力できるのですが、データが全て0として出力されてしまいます。

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • テキストファイルの出力について

    今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。

  • 改行されたtxtファイルの読み込み(C++)

    3374356,4785323,7043817,5111179,8267572, 6486903,3258714,6344689,8620512,7434933, 8088837,8231528,6524254,5928445,7101798, 5338215,5233711,4753647,5930266,7512232, 5343749,5813061,6439450,6257874,5724787, 5864114,9006652,4871427,6158077,7343041, 7615426,7168142,5866379,8154664,7342803, という形式のデータ数1000のtxtファイルがあります。 解析に使用したいのでCに読み込みたいのですが、方法が調べても分からず困っています。とりあえず以下が、データが一行の際に使用しているソースコードです。 FILE *fp; char linebuf[4096]; char *p; int array[1024]; int data=0; fp=fopen("randombetarev.txt","r"); if(!fp) return 1; fgets(linebuf,4096,fp); fclose(fp); p=strtok(linebuf,","); do{ array[data]=atoi(p); data++; }while(p=strtok(NULL,","));//ここまででデータを配列に格納 これでは改行の判別ができないので初めの一行目のデータしか読み込めません。どなたかご教授ください。

  • C言語 ファイルの出力

    こんにちは。 現在C言語学習中でファイルの出力でエラーが発生したのですが、どのようにエラーを起こしているのかわかりません。 ご指摘をお願いします。 #include<stdio.h> int main(void) { FILE *fp = NULL; fp = fopen("test1.txt", "w"); if(fp == NULL){ printf("ファイルをオープンでいませんでした。\n"); return -1; } else{ printf("ファイルをオープンしました。\n"); } fputs("Hello!\n", fp); fputs("Hello World!\n", fp); printf("ファイルに書き込みました。\n"); fclose(fp); printf("ファイルをクローズしました。\n"); int i; scanf("%d", &i); return 0; } エラーの内容は 1>LINK : fatal error LNK1104: ファイル 'C:\Users\拓哉\Documents\Visual Studio 2010\Projects\sample.c\Debug\sample.c.exe' を開くことができません です。現在使用中のC言語環境は上記の通り、Visual Studio 2010です。 学習仕立てで、あまりプログラミングについて知りません。 よろしければ、他に何か間違いがあればご指摘お願いします。

  • 0x00をファイル出力

    #define TEST 0x00 FILE *fp; UCHAR wbuf[1]; wbuf[0] = TEST; if((fp=fopen("test.txt", "w"))==NULL){  printf("open error\n"); } fprintf(fp,"%s",wbuf[0]); fclose(fp); 以上がプログラムでこれを実行するとtest.txtには 文字化けして書き込まれます。 ファイルに0x00と表示させる為にはどうしたらいいですか?

  • fputsで改行できない

    $construction='aaa'; $explanation='bbb'; define(DATA, './data'); $fp = fopen(DATA . '/' . $name, 'w') or die('ファイルを開けません'); flock($fp, LOCK_EX); fputs($fp, $construction . "\\r\\n" . $explanation) or die ('ファイルに書き込めません'); fclose($fp); 作成されたファイルを開いてみると aaa\r\nbbbと表示され、改行されません。 "\\r\\n"ではなく"\\n"のみにしても同様です。 二十引用符にしているのに、改行されません。 fputsに複数の変数を同時に入れ、それぞれの間に改行をいれるにはどうすればよいでしょうか? 文字コードはShift-JISです。 ご教示頂けると幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう