• 締切済み

書式付標準出力をするには??

こんにちは テキストファイルを読み込んで .hファイルに書き込んでいるものなのですが.... #include <stdio.h> #define MAX 256 int main() { FILE *in, *out; char *p, buf[MAX]; int lhs, in_quote; in = fopen("moutput.txt", "r"); if (in == NULL) { printf("Cannot open sample.txt\n"); return 1; } out = fopen("moutput.h", "w"); if (out == NULL) { printf("Cannot open sample.h\n"); return 1; } while (fgets(buf, MAX, in) != NULL) { lhs = 1; in_quote = 0; for (p = buf; *p != '\0'; p++){ if (*p == '=') { lhs = 0; fputc('\n', out); } else if (*p == '"'){ if (in_quote) { in_quote = 0; fputc('\n', out); } else in_quote = 1; }else if (lhs || in_quote){ fputc(*p, out); } } } } 上記のプログラムでfputc(*p,out)で出力させている 部分があると思いますが。 実はこれを書式付で出力させたいと思っています。 今現在読み込んでいるファイルは "POINT_a"="POINT_b"+1000*"POINT_D" で出力結果は POINT_a POINT_b POINT_D なのですが これを VALUE: POINT_a VALUE: POINT_b VALUE: POINT_D にしたいのですが fputcのところをどうしたらいいでしょうか?? ご教授よろおしくおねがいします。

みんなの回答

  • min_is
  • ベストアンサー率25% (1/4)
回答No.5

あらかじめ文字列用のバッファを用意しておき >fputc(*p, out); の代わりに1文字づつコピーすればよいのでは。 あとは for ループから抜けたところで printf("VALUE: %s\n",コピー用バッファ); みたいな感じでよいのではないでしょうか? # コピー用バッファの文字列終端に注意してください。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

(件名と内容に齟齬があるけど・・) >fputc のところをどうしたらいいでしょうか?? >ご教授よろおしくおねがいします。  「教授、よろおしくおねがいね」の間違いでは・・?。  女子大生に言われれば、「うん、いいよ」となるな。 ☆fputc にこだわらずに・・ではダメですか。  「ファイル」でなく、「画面」のものを投稿します。    (BorlandC++5.6.4)  「ご教示方」には程遠いかな、「参考」として下さい。 ・現状で動作をご確認頂き、「ファイル」にする場合は、「 printf( 」を「 fprintf( out, 」と置換すれば・・。 #include <stdio.h> #define MAX 256 int main() {  char buf[MAX] = "\"POINT_a\"=\"POINT_b\"+1000*\"POINT_D\"\n";  int i, iCnt; // ファイル関連 // while( NULL != fgets( buf, MAX, in ) ){   printf( "%s", buf ); // この行は「画面」時のみ   iCnt = 0;   for( i = 0; i < MAX; i++ ){    if( '\n' == buf[ i ] ) break; // 1行終了    if( '\"' == buf[ i ] ){     iCnt++;     if( iCnt % 2 ){ // 括り始め      printf( "VALUE: " );      continue; // 頭の " は不要     }     printf( "\n" );// 括り終わり・改行     continue; // 後ろの " も不要    }    if( 0 == ( iCnt % 2 ) ) continue; // 不要文字    printf( "%c", buf[ i ] ); // 括り内文字出力   }  fcloseall();  return( 0 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>fprus関数とはなんでしょうか それはおそらくタイプミスで、 本当はfputsとタイプしたかったのではないかと思います。

noname#208124
noname#208124
回答No.2

fprintf で 標準出力ってstdoutのことを言うもんじゃないの?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

> fputc('\n', out); > } else > in_quote = 1; > }else if (lhs || in_quote){ > fputc(*p, out); を fputc('\n', out); } else { in_quote = 1; fprus( "VALUE:", out ); } }else if (lhs || in_quote){ fputc(*p, out); といった具合でいいのでは

lilhalileh
質問者

補足

返信ありがとうございます。 調べたんですけど....... fprus関数とはなんでしょうか?? 一応自分C言語で OSはソラリス(コマンド:vi) なんですけど......。

関連するQ&A

  • whileは2度呼べる!?

    質問させていただきます。。 何度か似たような質問をさせて頂いていますが、 今回もちょっと掘り下げた質問になっていますので。。。。 ファイルの内容を読み取って.hファイルに書き込むのですが。 ファイルの中身が POINT_A="POINT_B"+"POINT_C" POINT_B="POINT_C"*"POINT_A"   だとします。 狙いとしては POINT_A POINT_B POINT_C です。下記のソースでは右辺と左辺を分けているのですが.... 重複した場合.hファイルに書き込まないようにしています。 問題の場所は/* 右辺の値をとって.hファイルに書き込む関数 */の部分で2回while を使って読み込みをしているのですが何かおかしいとこは ありますでしょうか?? #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 10000 int leftsidehfunction(); int rightsidehfunction(); int main(int argc ,char **argv) { if(argc != 2 ){ printf("引数の数があっていません。\n"); } rightsidehfunction(argv[1]); } /* 右辺の値をとって.hファイルに書き込む関数 */ int rightsidehfunction(char cfilename[MAX]) { FILE *ft; // 入力ファイルポインタ FILE *fh; // 出力ファイルポインタ int c; //読み込み文字 char buf[MAX]; //バッファ領域 char buf1[MAX]; char cPid[MAX]; // 採取したPID char *cWorkRegiAdd; // 採取文字列作業域アドレス char *cStoRegiAdd; // 文字列格納域アドレス char *cRegiTab[MAX]; // 文字列登録表 int iflag = 0; // 0/1; 右/左のクオート int ichs = 0; // chrの文字数 int istr = 0; // strの文字数 int k; // ntrの探索index int iOid; //OID char cgetfilename[MAX]; char *p; strcpy(cgetfilename,cfilename); ft = fopen(cgetfilename, "r"); strtok(cgetfilename,"."); strcat(cgetfilename,".h"); fh = fopen(cgetfilename, "a+"); if (ft == NULL || fh == NULL) { printf("%s ファイルを開けません。\n",cgetfilename); } while ((c = fgetc(ft)) != EOF) { switch (c) { case '"': iflag = 1 - iflag; /*右のクオート*/ while(fgets(buf1,sizeof buf1,fh) != NULL){ strtok(buf1," "); p = strtok(NULL," "); if (iflag == 0) { cPid[ichs] = '\0'; cWorkRegiAdd = cPid; for(k = 0;k < istr;k++){ if(*cRegiTab[k] != *cWorkRegiAdd) continue; if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break; } if(k == istr){ //no hit in str[] cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cRegiTab[istr] = cStoRegiAdd; istr++; db_obj_find_pid(cStoRegiAdd, &iOid); if(iOid <= 0 ){ if(p != cStoRegiAdd){ fprintf(fh, "#define %s 0\n", cStoRegiAdd); }else if(p == cStoRegiAdd){ break; } }else{ if(p != cStoRegiAdd){ fprintf(fh, "#define %s output[obj[%d].outputs + 2].Analog\n",cStoRegiAdd, iOid); }else if(p == cStoRegiAdd){ break; } } } ichs = 0; } iOid = 0; } break; case '\n': if (iflag == 1) { cPid[ichs] = '\0'; iflag = 0; } ichs = 0; break; default: if (iflag == 1) { cPid[ichs] = c; if (ichs < MAX - 1) { ichs++; } } break; } } if (ichs>0) { cPid[ichs]='\0'; } fclose(ft); fclose(fh); return 0; }

  • C言語でセグメンテーションエラー

    環境はUbuntu Feisty Fawn gcc 4.1.2 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 32 #define DEBUG struct node{ char *moji; struct node *left,*right; }; typedef struct node NODE; void error(char *msg){ fflush(stdout); fprintf(stderr, "%s\n", msg); exit(1); } NODE *createNode(char *x){ NODE *new; new = malloc(sizeof(NODE)); if(new == NULL){ error("メモリがありません。\n"); } new->moji = x; new->left = NULL; new->right = NULL; return new; } NODE *insertNode(NODE *p, char *x){ if(p == NULL){ p = createNode(x); }else if(strcmp(p->moji, x) == 0){ return NULL; }else if(strcmp(p->moji, x) > 0){ p->left = insertNode(p->left, x); }else{ p->right = insertNode(p->right, x); } return p; } void printTree(NODE *p){ if(p == NULL) return; printTree(p->left); printf("%s\n",p->moji); printTree(p->right); } int main(int argc, char *argv[]){ FILE *fp; char *buf = malloc(sizeof(char) * MAX); char *ans = malloc(sizeof(char) * MAX); NODE *p = malloc(sizeof(NODE)); if( argc > 2 ){ printf("ファイルの指定は一つだけです。\n"); return -1; }else if(argc == 1){ printf("ファイルを指定してください。\n"); return -1; } fp = fopen( argv[1] , "r" ); if( fp == NULL ){ printf("ファイル読み込みに失敗しました。\n"); return -1; } while(fscanf(fp,"%s",buf) == 1){ ans = strtok(buf," -,."); p = insertNode(p, ans); while(ans != NULL){ ans = strtok(NULL," -,."); if(ans != NULL){ p = insertNode(p, ans); } } } printTree(p); fclose(fp); return 0; } このファイルを読み込んで記憶させたいんです。 file.txt ここから下がファイルの中身 The Java programming language is a general-purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve fluency in the language. どこがいけないとおもいますか?

  • ちょっとした疑問なんですが・・・(C言語)

    何度も質問してごめんなさい! ちょっとした疑問なんですが、下記のプログラム中の、 while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch, out); } のコードで、「while(!feof(in))」でストリーム「in」結び付けられているファイルの終わりに達していれば繰り返し処理を終えるのは分かるのですが、 なぜ、インクリメントも無くファイルの終わりまで文字を調べ進めることができるのでしょうか? 未熟者の私ですが教えて頂けないでしょうか? 【プログラム例】 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *in, *out; unsigned char ch; if(argc!=3) { printf("使用法: <プログラム名> <入力ファイル名> " "<出力ファイル名>\n"); exit(1); } if((in = fopen(argv[1], "rb"))==NULL) { printf("入力ファイルを開くことができません\n"); exit(1); } if((out = fopen(argv[2], "wb"))==NULL) { printf("出力ファイルを開くことができません\n"); exit(1); } while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch, out); } fclose(in); fclose(out); return 0; }

  • 何処が間違っていますか?

    ---------------------------------------------------------------------------------------- #include<stdio.h> #include<stdlib.h> #define MAX_LINE 128 int main(void); int main(void) { char buf[MAX_LINE]; int n; printf("降水確率を入力してください。\n"); gets(buf); n = atoi(buf); printf("降水確率は %d %% です。\n",n); if (n >= 50) { printf("傘を忘れずにね。\n"); } else { printf(傘はいりません。\n"); } printf("いってらっしゃい。\n"); return(0); }

  • エラーがでてしまいます

    以下のプログラムなのですが、引数を与えると下のようなエラーになります。 #include<stdio.h> #include<stdlib.h> int main(int argc, char** argv) { FILE *in ,*out; unsigned char ch; if(argc != 3) { printf("入力エラーです。\n"); exit(1); } if((in = fopen(argv[1],"rb")) == NULL) { printf("入力ファイルが開けません。\n"); exit(1); } if((out = fopen(argv[2],"rb")) == NULL) { printf("出力ファイルが開けません。\n"); exit(1); } while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch,out); } fclose(in); fclose(out); return 0 ; } tyobi@tyobi-laptop:~$ gcc test.c diary copy diary: file not recognized: File format not recognized collect2: ld はステータス 1 で終了しました どうしたらよいのでしょうか?

  • use constantの意味が分からない

    以下の use constant SMAX => 50;とuse constant CMAX => 10; を $SMAX = 50; $CMAX = 10; に変更し、if ( SMAX < $max ) { $n = $max - SMAX; }も if ( $SMAX < $max ) { $n = $max - $SMAX; } と変更しましたが、機能してませんでした。 どこが間違っておりますでしょうか? 宜しくお願いします。 以下がCGIです。 #!/usr/bin/perl # 保存するコメント数 use constant SMAX => 50; # 表示するコメント数 use constant CMAX => 10; #----------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST"){ read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } @list = split (/&/,$buffer); foreach (@list){ ($key,$value) = split (/=/,$_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/ pack ("C",hex($1))/eg; $getdata{ $key } = $value; } $x = $getdata{ 'px' }; $y = $getdata{ 'py' }; $comment = $getdata{ 'com' }; $file = 'comment.dat'; open (IN,"$file"); @list = <IN>; close (IN); chomp(@list); $max = @list; if ( $x != '' ){ $writedata = $x.'<>'.$y.'<>'.$comment; if ( SMAX < $max ) { $n = $max - SMAX; } else { $n = 0; } open (OUT,"> $file"); flock(OUT,2); for ( ; $n < $max; $n++ ) { print OUT $list[$n]."\n"; } print OUT $writedata; close (OUT); } if ( CMAX < $max ) { $n = $max - CMAX; } else { $n = 0; } print "Content-type: text/html\n\n"; for ( ; $n < $max; $n++ ) { print $list[$n]."\n"; } if ( $x != '' ){ print $writedata; } exit ;

    • ベストアンサー
    • Perl
  • 指定した文字列を探して・・・

        第1引数の文字列中に第2引数で指定した文字がある場合に、その     文字のあるアドレス(ポインタ)を返す関数doko()作成し、     プログラムを完成させよ。     指定した文字がない場合はNULL(ヌルポインタ)を返すものとする。     配列の[](カギカッコ)を利用しないで作る事     main内は変えないこと いろいろと模索したのですが、strcpyなどは使うのでしょうか? 参考サイトを見たりしたり、ほかの質問などを見たのですが なかなか理解できずに現在にいたってます 以下のコードのdokoは沢山やりすぎたので一番シンプルな間違い方をしています 何かご指摘あればお願いします #include <stdio.h> #define MAX 128 char* doko(char *,char); int main() { char buf[MAX]; char *p = "abcdef12345"; char *r; r = doko(p, 'f'); if (r == NULL) { printf("mojiretsu ni f toiu moji ha arimasen\n"); return 0; } printf("%s (= f12345)\n", r); scanf("%s", buf); r = doko(buf, 'x'); if (r == NULL) { printf("mojiretsu ni x toiu moji ha arimasen\n"); return 0; } printf("%s\n", r); return 0; } char* doko(char *p,char a) { while(*p){ if(*p == a){ return p; } if(*p != a){ return NULL; } ++p; } }

  • c言語 iconv

    msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.第1引数に変換対象のファイル名,第2引数にファイルの文字コードを指定しています. #include <stdio.h> #include <string.h> #include <iconv.h> int main(int argc, char *argv[]) { iconv_t conv; char src[10000]; char dst[10000]; int src_len = strlen(src); int dst_len = sizeof(dst) - 1; char *buf_in; char *buf_out; FILE *fp; fp = fopen(argv[1], "r"); if(NULL == fp) { printf("ファイルを開けません\n"); } else { while(fgets(src, 10000, fp) != NULL) { buf_in = src; buf_out = dst; /* 変換器を作成 */ conv = iconv_open("Shift-JIS", argv[2]); /* 変換 */ iconv(conv, &buf_in, &src_len, &buf_out, &dst_len); *buf_out = '\0'; /* 終末処理 */ /* 文字コード後の文字列を表示 */ printf("%s\n", dst); } /* 変換器を終了 */ iconv_close(conv); /*ファイルを閉じる*/ fclose(fp); } return 0; }

  • コマンドプロンプトからファイルへの出力

    失礼します。 いまテンプレートマッチングを用いた物体追跡を行っています。 画面内に映っている物体のなかでテンプレート画像とマッチした部分を四角で囲み追跡します、さらにその部分のピクセル座標を随時コマンドプロンプトに表示させています。 そこで質問なのですが、このコマンドプロンプトに表示させている座標をtxtファイルに出力させたいのですが可能でしょうか?? ためしに自分でやってみたのですがうまくいきませんでした。。 よろしければアドバイスお願いします。 以下に関係ある部分のソースコードを載せます。 ofstream fout("matchdata.txt"); if(!fout){ cout<<"ファイルをオープンできませんでした。\n"; return 1; }else{ cout<<"ファイルをオープンしました。\n"; } //ループ開始 while(1){ //カメラ・デバイスから画像取得 memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(frameImage,grayImage,CV_BGR2GRAY); // テンプレートマッチングを行う cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED ); // テンプレートが元画像のどの部分にあるのかという情報を得る cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL ); if(max_interlinkage>0.60){ corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height); //コマンドプロンプトへの表示 printf("point x=%d ",max_point.x+templateImage->width); printf(" y=%d ",max_point.y+templateImage->height); cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT); printf("\n"); } fout<<"point x= "<<max_point.x+templateImage->width<<" y= "<<max_point.y+templateImage->height; fout.close(); // ウィンドウを生成する cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE ); // 画像を表示する cvShowImage( windowNameTemplate, templateImage ); cvShowImage( windowNameDestination , frameImage ); //キー入力 key = cvWaitKey(1); if(key=='q'){ break; }else if(key=='c'){ cvSaveImage("image/frame.bmp",frameImage); } }

  • str ! = NULL

    いつもお世話になっております。 下記のプログラムを実行したところ、 Line: 55 Expression : (str !=NULL) とエラーが表示されました。 ファイル名もデレィクトリにあります。 使っているソフトは、Visual studio 2010です。 すいませんが、教えてください。本当に些細なことでも大丈夫です。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <math.h> #define PMAX 200 #define MAG 1 struct point { double x; double y; }; int main(void){ FILE *fp, *out; struct point p[PMAX]; int index, i, point_num, start; double distance; if( (fp = fopen( "zahyou1.csv", "r")) == NULL ) { printf( "can not open the file.\n" ); } if( (out = fopen( "out.csv", "w")) == NULL ) { printf( "can not open the file.\n" ); } i = 1; while( fscanf(fp,"%d,%lf,%lf", &index, &p[i].x, &p[i].y) != EOF){ i++; } point_num = i; // which point to start //printf("from which point? : "); //scanf("%d",&start); for(start=1;start<point_num;start++) { printf("start point : %d\n", start); fprintf(out,"start,%d\n", start); for(i=1;i<point_num;i++) { distance = sqrt(pow(p[start].x - p[i].x, 2) + pow(p[start].y - p[i].y, 2)); distance *= MAG; printf("%3d %f\n", i, distance); fprintf(out,"%d,%f\n", i, distance); } printf("------------------------------------------\n"); } return 0; }

専門家に質問してみよう