ファイルへの書き込みについて

このQ&Aのポイント
  • C言語を使用したプログラミングでファイルへの書き込みができない場合の対処方法
  • メインプログラムでファイルを開き、サブプログラムでファイルへの書き込みを行う方法
  • ファイルへの書き込みにおいて、不正な処理が発生しプログラムが異常終了する問題への解決策
回答を見る
  • ベストアンサー

ファイルへの書き込みについて

はじめまして、よろしくお願いします。 <質問>C言語を使用したプログラミングで、     下記ソースのように、     ファイルへ書き込むことは可能であればご指摘お願いします。     ※上手に値が渡せていないようで、      実行すると不正な処理?で落ちてしまいます。 <書き込む方法>     1)メインプログラムで書き込むファイルのOPEN     2)サブプログラムで処理を行いファイル書き込み(1)       サブプログラムで処理を行いファイル書き込み(n)     3)メインプログラムで書き込んだファイルをCLOSE <イメージ> #include <stdafx.h> #include <stdio.h> void sub( int i, FILE *fp ); int main(){ FILE *fp; fp = fopen("c:\\0511.txt","w"); int i; for( i = 1; i < 100; i++ ){ sub( i, fp ); } fclose(fp); } void sub( int i, FILE *fp ){ char moji[2]; sprintf(moji,"%3d",i ); fprintf(fp,"%s",moji ); } <補足>VC++2005 ExpressEdition でビルドは出来ました。 お手間おかけしますが、よろしくお願いします。

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

moji が 2 バイトしかないのに sprintf(moji, "%3d", i); しているから落ちてるだけでは? そして fprintf() で指定した文字列に終端文字がないし そもそも、fprintf() で直接フォーマットを指定すればよいと思いますけど。

CCLemon70
質問者

お礼

こんばんは 早速の回答ありがとうございます。 上記イメージを下記のように変更したところ、問題なく動きました。 <メイン部分>  for( i = 1; i < 10; i++ ){ <サブ部分>  char moji[2];  sprintf(moji,"%d",i );  fprintf(fp,"%s\n",moji ); これに付け加えて、 >そもそも、fprintf() で直接フォーマットを指定すればよいと思いますけど。  下記のように変更することで、結果が得られました。 <サブ部分の処理を下記のみ>  fprintf(fp,"%d%s\n",i,"\0" ); ただ、文字列の処理を行う必要があると考えていますので、 いきなり「fprintf」で指定するのは難しそうです。 解決です。お忙しい中ありがとうございました。 以上

関連するQ&A

  • 文字列操作(終端と抽出)について

    こんばんは お時間等ございましたら、ご指摘よろしくお願いします。 <背景>メインプログラムからサブプログラムに複数の数値を渡して、     文字列として編集します。     そして、その文字列から特定の文字のみを抽出し、     ファイルに出力したいと考えています。     ※下記にソースイメージを記しました。      ただ、While文の指定がうまくなく、      想定どおり処理を抜けれません。 <質問>サブプログラムでファイルに出力する文字のうち、     抽出する文字と抽出しない文字はランダムで、     メインプログラムから、渡されてきます。     ※文字列の文字数は、     メインから渡され編集した文字数>=ファイルに出力する文字数。     サブプログラムの先頭で出力する文字列の大きさを     指定しているのですが、抽出しない文字があった場合、     抽出しない文字数分ゴミが出力されてしまうのを     防ぎたいと考えています。 <イメージ> #include <stdio.h> void sub( int a, int b, int c, FILE *fp ); int main(){ FILE *fp; fp = fopen("c:\\0511.txt","w"); int a;int b;int c; a = 1; b = 0; c = 1; sub( a, b, c, fp ); fclose(fp); } void sub( int a, int b, int c, FILE *fp ){ int j = 0; char moji[4];char moji2[4]; sprintf(moji,"%d%d%d%s",a,b,c,"\0" ); while( moji[moji[*moji]] != '\0' ){ switch( moji[moji[*moji]] ){ case '1' : moji2[j] = moji[moji[*moji]]; break; case '0' : j -= 1; break; default :;break; } moji[*moji] += 1;j += 1; } fprintf(fp,"%s\n",moji2 ); }// Run-Time Check Failure #2 - Stack around the variable 'moji' was corrupted. もし宜しければ、ご指摘の程よろしくお願いします。

  • ファイルへの書込み処理が異常に遅い

    以下のファイルへの書込みを行なうプログラムの処理速度が極端に遅く困惑しています。 -------------------------------------------------------------------------------- /*  文字列"0,"をファイルに約2MB出力するプログラム  (2000文字で改行、1行毎にfopen&fclose) */ #include<stdio.h> void main( int argc, char *argv[] ) {   FILE *fp;   for( int i = 0; i < 1000; i++ )   {     if( !(fp = fopen( "C:\hogehoge.log", "a" ) ) )     {       exit( 1 );     }     for( int j = 0; j < 1000; i++ )     {       fprintf( fp "0," );     }     fprintf( "\n" );     fclose( fp );   }   exit( 0 ); } -------------------------------------------------------------------------------- 処理時間は5分程度です。 出力する文字列を"0#"に変えると5~6秒で終了します。 カンマが入ると違うのでしょうか? OSはWinXP、コンパイラはVC++7.0です。 原因と解決策をご存知の方、よろしくご教示下さい。

  • Cプログラム ファイルの書き込み→読み込み

    #include<stdio.h> void p07a(char *name); void p07b(char *name); //メイン関数 int main() { char name[100]; printf("File Name?"); scanf("%s",name); //ファイルへの書き込み p07a(name); //ファイルからの書き込み p07b(name); puts("!!!!!END!!!!!"); return(0); } //ユーザー関数 void p07a(char *name) { while(1) { int a,b; FILE *fp; fp=fopen("name","w"); scanf("%d,%d",&a,&b); fclose(fp); } } void p07b(char *name) { int i,a[i],b[i],sum,sumb,aave,bave; FILE *fp2; i=0; sum=0; sumb=0; while((fscanf(fp2,"%d,%d",&a[i],&b[i]))!=EOF){ sum+=a[i]; sumb+=b[i]; i++; } aave=sum/i; bave=sumb/i; fclose(fp2); } のプログラムなのですが、書き込むファイル名を入力しても次の処理へ進みません ユーザー関数がおかしいのでしょうか?

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

    現在、ヒストグラムのプログラムを作成しています。 まず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]++; } }

  • ファイルが読み込めない・・・

    ファイルを読み込もうとプログラムを作ったのですが 変なエラーがでてくるのですが。なにがおかしいのですか? #include <stdio.h> int main (void) { FILE *fp; char nyuryoku_moji[256]; char deta_name[256]; gets(deta_name); fp = fopen (deta_name,"r"); fgets(nyuryoku_moji,256,fp); printf("%s",nyuryoku_moji); fclose(fp); return 0; } です、エラーはDebug Libraryとでるのですが・・・ わかる方がいらっしゃったら教えてください。 お願いします。 -----環境-------------- os windows NT soft MicrosoftVisualC++ -----------------------

  • テキストファイルの同期

    はじめまして、超初心者プログラマのmoominといいます。 ファイルの同期プログラムに関して質問があるのですが、 あるテキストファイルを、他のディレクトリのテキストファイルとを 常に同期をするプログラムを作成しています。 これが作成したソースです。 ------------------------- #include "stdafx.h" #include <stdio.h> #include <windows.h> int _tmain(int argc, char *argv[]) { FILE *fp,*copy; int buffer; fp=fopen("○○○/×××.txt","rb"); copy=fopen("aaa/fff.txt","wb"); for(int i=1;i>0;i++){ fread(&buffer,sizeof(buffer),1,fp); fwrite(&buffer,sizeof(buffer),1,copy); if(feof(fp)){ fclose(fp); fclose(copy); } } return 0; } VC2008を利用して作成していますが、 一度きりの同期なら可能なのですが、 常に同期するというプログラムがわかりません。 どう変えればよいでしょうか?

  • ファイル書き込み操作について

    C言語でファイル書き込みを行う以下のプログラムを改造したいと思っています。 #include <stdio.h> #include <stdlib.h> int main() { char filename[10] = "output"; char strs[][10] = { "1.aaa\n" ,"2.\n" ,"3.\n" } FILE* fp; int i; int length; fp = fopen(filename , "w"); if (fp == NULL) { printf("cannot open file\n"); exit (1); } length = sizeof(strs)/10; for( i = 0; i < length ; i++ ) { fputs( strs[i], fp ); } fclose(fp); return 0; } この場合、outputの内容は、 1.aaa 2. 3. となりますが、 2行目にはscanf等を使いプロンプトから読み込んだbbbという文字列、 3行目にはtxtファイルから読み込んだcccという文字列を書き込むというような仕様にしたいと思っています。 その結果outputは、 1.aaa 2.bbb 3.ccc となるようにしたいです。 サンプルを改良してこのような仕様を満たすプログラムができますでしょうか?回答よろしくお願いします。

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • C言語 ファイルポインタ

    度々同じプログラムで質問させてもらっています。 #include <stdio.h> #include <time.h> #include <math.h> #define N 10 void filewrite(int i,int a[]); void main(void){ int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%10+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; filewrite(i,a); } } void filewrite(int i,int a[]){ int s; FILE *fp; fp = fopen("selection.txt","w"); if(fp == NULL)return; for(s=0;s<i;s++){ fprintf(fp,"%d,",a[s]); } fprintf(fp,"\n"); fclose(fp); } 途中経過もテキストファイルで出力したいのですが、このプログラムを実行すると最後の結果しか出力されません。 アドバイスをよろしくお願いします。

  • ファイルの入出力に関する質問

    CSVファイルを読み込んで、処理をするプログラムを書いています。 しかし、うまくいきません。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムは以下の通りなんですが。。。 strtokはhttp://www9.plala.or.jp/sgwr-t/lib/strtok.html を参考にしました。 どなたかおしえていただけないでしょうか? #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[1000][1000]; char tp[256]; int i=0; if((fp=fopen("in.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ tp=strtok(fp,","); puts(s[i][0]=tp); while (tp != NULL ) { tp = strtok(NULL,","); if (tp= NULL ){ puts(s[i][1]=tp); }}i++; } return(0); }