ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:ファイルへの書き込みについて) ファイルへの書き込みについて 2008/05/11 14:15 この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 でビルドは出来ました。 お手間おかけしますが、よろしくお願いします。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー koko_u_ ベストアンサー率18% (459/2509) 2008/05/11 14:23 回答No.1 moji が 2 バイトしかないのに sprintf(moji, "%3d", i); しているから落ちてるだけでは? そして fprintf() で指定した文字列に終端文字がないし そもそも、fprintf() で直接フォーマットを指定すればよいと思いますけど。 質問者 お礼 2008/05/11 22:51 こんばんは 早速の回答ありがとうございます。 上記イメージを下記のように変更したところ、問題なく動きました。 <メイン部分> 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」で指定するのは難しそうです。 解決です。お忙しい中ありがとうございました。 以上 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連する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); } のプログラムなのですが、書き込むファイル名を入力しても次の処理へ進みません ユーザー関数がおかしいのでしょうか? ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 同時にファイル読み込み 書き込み 現在、ヒストグラムのプログラムを作成しています。 まず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); } C++のファイルの分割について教えてください。 分割したプログラムの書き方を練習中なのですが、 下のようなプログラムを書いて、ビルドしようとしたら失敗します。 どこが悪いのか、教えていただけないでしょうか? (5)\test30\Debug\test30.exe : fatal error LNK1120: 外部参照 1 が未解決です。 1>test30 - エラー 2、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== //test30.cpp #include <iostream> #include "sub.h" int main(void) { std::cout<<"メインプログラムです。"<<std::endl; sub1(); sub2(); return 0; } ------------------------------------------------------------- //sub1.cpp #include <iostream> void sub1(void) { std::cout<<"サブ1です。"<<std::endl; } ------------------------------------------------------------- //sub2.cpp #include <iostream> void sub1(void) { std::cout<<"サブ2です。"<<std::endl; } --------------------------------------------------------------- //sub.h void sub1(void); void sub2(void); c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を読み込みたいんですけど できません。 おしえてください。 プログラムは・・・・ #include<stdio.h> #include<ctype.h> int main(void){ char x[500][4]; FILE *fp; int i,j; fp=fopen("data2.txt","r"); for(i=0;i<500;i++){ for(j=0;j<4;j++){ fscanf(fp,"%c",&x[i][j]); } printf("%c,%d,%d,%d\n",x[i][0],x[i][1],x[i][2],x[i][3]); } fclose(fp); } ファイルは 田中,5,abc,18 鈴木,89,57,21 佐藤,,8,69 高橋,95,9,7 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム ファイルの読み込み(プラグラムに関する質問) 下記のプログラムを書きました。そのプラグラムについて質問させてください。 添付画像のCSVファイルを読み込んでも数値が正しく表示できていません。(添付画像のコマンドプロンプト参照) どうすれば正しく表記されるのでしょうか? また、2列以上にデータが存在するCSVファイルがある場合はどのような処理をすれば良いのですか? わかる方がいましたら教えていただけないでしょうか? よろしくお願いします。 #include <stdio.h> #include <conio.h> int main(void) { FILE *fp; double x; int n; fp = fopen("1.csv", "r"); if(fp == NULL) return 0; while( fscanf(fp, "%f\n", &x) != EOF ){ printf("%f\n", x); getch(); } fclose(fp); return 0; } fpus:ファイル操作 Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); } ファイルに関する質問 「fputc(a,fp);」←の関数で、変数aに入っている文字がファイルに書き込まれるはずなのですが、書き込まれません何故なのでしょうか。。。。(変数aへの入力までは上手く行くんですが、プログラムはそこで終わってしまって ファイルに入力されない・・) ついでにソースは↓です(つくり途中 #include<iostream.h> #include<conio.h> class editor{ public: editor(){ FILE *fp; fp = fopen("kansu.txt","w+"); cout<<"ファイルを開きました、関数の作成を開始します、関数の型名を入力してください(戻り値がある場合は、「int」無い場合は「void」と入力してください)"<<endl; int a; cin>>a; fputc(a,fp); }; }; void main(){ editor(); }; fputs:ファイル操作 Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); } txtファイルの文字を配列に格納 ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード ファイルへの書き込み ループ内で、10進数数字(文字コード)をchar型変数に入れ、指定文字アペンド(a)を使用して文字をファイル(.txt)に出力したいのですが、うまくできません。fputc関数で作成したファイルをみると、必ず最後の文字が先頭に記述されます。 例)(※文字コードは手持ちの開発環境でのもの) 「65」「66」「83」の順に「MOJI」に入れると「printf」で標準出力されるのは「A」「B」「S」の順なのですが、ファイルにはなぜか「SAB」の順になっています。 以下プログラムで行いました。(必要不可欠なものでも決まり文句等を含め、一部省略しています) ~略 FILE *fp; char MOJI; int SUUJI; while(・・・) { ~略~ MOJI = SUUJI; printf("%c\n",MOJI); fp = fopen("・・・.txt","a"); fputc(MOJI,fp); } ~以下略 元々このような機能なのでしょうか。 原因と解決方法を教えていただければと思います。 よろしくお願いします。 ファイル c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。 テキストファイルの内容を2次元配列に格納したい 課題で用意されたテキストファイルを読み込み、空白を区切りとする文字列の単位で配列に格納したいのですが、やりかたがわかりません。 ソースプログラムですが #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 1000 int TextSplit(char *fname, char (*SpStr)[50]); int main(void) { int i, n; char fname[MAX], SpStr[MAX][50]; int Split; FILE *fp; printf("input File =>"); scanf("%s", fname); Split = TextSplit(fname, SpStr); printf("\n %d[文字列数] \n", Split); return 0; } int TextSplit(char *fname, char (*SpStr)[50]) { int i, j, k; char Readstr[MAX]; FILE *fp; fp = fopen(fname, "r"); if(fp == NULL) { printf("ファイルオープン失敗"); return 1; } i = 0; while(fscanf(fp, "%s", SpStr) != EOF) { i++; } fclose(fp); return i; } 以上のソースプログラムですが、内容は「空白で区切る文字列の単位の総数を表示する」ものになっています。 今日の20時までに終わらせないといけないので、ご教授お願いします。 使ってるソフトはMicrosoft Visual Studioです。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
こんばんは 早速の回答ありがとうございます。 上記イメージを下記のように変更したところ、問題なく動きました。 <メイン部分> 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」で指定するのは難しそうです。 解決です。お忙しい中ありがとうございました。 以上