- ベストアンサー
ファイルへの書き込み
ループ内で、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); } ~以下略 元々このような機能なのでしょうか。 原因と解決方法を教えていただければと思います。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- a-saitoh
- ベストアンサー率30% (524/1722)
- FAY
- ベストアンサー率49% (95/193)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
- charmer29-2
- ベストアンサー率25% (41/159)
関連するQ&A
- ファイル
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・C++・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 でビルドは出来ました。 お手間おかけしますが、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。
こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^Dº?^QIèÇ ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^Dº?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。
- 締切済み
- C・C++・C#
- 文字列操作(終端と抽出)について
こんばんは お時間等ございましたら、ご指摘よろしくお願いします。 <背景>メインプログラムからサブプログラムに複数の数値を渡して、 文字列として編集します。 そして、その文字列から特定の文字のみを抽出し、 ファイルに出力したいと考えています。 ※下記にソースイメージを記しました。 ただ、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. もし宜しければ、ご指摘の程よろしくお願いします。
- 締切済み
- C・C++・C#
- ファイルが読み込めない・・・
ファイルを読み込もうとプログラムを作ったのですが 変なエラーがでてくるのですが。なにがおかしいのですか? #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++ -----------------------
- ベストアンサー
- C・C++・C#
- 大量のファイルの読み込みについて
-512.txt~512.txtのファイルを順に読み込むプログラムを 作っています。 以下のコードのように作って動かしてみたのですが, -512から-3.txtまで入力してくれるのですが -2.txtの所でエラーが起きてしまいます. ファイルは確実に存在するのですが… fopenには大量のファイルを読み込むのは向いてないのでしょうか? 他に良い方法があれば教えて頂けると幸いです. 宜しくお願いします #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int i=0; char s[256]; char filename[256]; //ファイル名編集 for(i=-512;i<512;i++){ fp=NULL; sprintf(filename,"distance\\routing_a\\%d.txt",i); printf("%sを読み込みます\n",filename); /* ここで、ファイルポインタを取得する */ if ((fp = fopen(filename, "r")) == NULL) { printf("%s file open error!!\n",filename); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } } fclose(fp); /* (5)ファイルのクローズ */ return 0; } 環境 OS:windows XP 開発環境 visual studio 2008
- ベストアンサー
- C・C++・C#
- ファイル出力で改行を入れたい!
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"); }
- ベストアンサー
- C・C++・C#
- ファイルから文字列を読み出して16進数に変換
test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26
- ベストアンサー
- C・C++・C#
- ファイルからの読み込み(初心者)
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char s[256]; if ((fp = fopen("memo.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); } while (fgets(s, 256, fp) != NULL) { printf("%s", s) } fclose(fp); return 0; } というファイルから1行読み込むというプログラムなのですが いくらやってもファイルが開けませんにしかなりません。 ファイル名の所が間違ってるのだとは思いますが・・ ファイルはメモ帳で作った簡素なファイルで ファイル名:memo ファイルの種類:テキスト文書(*.txt) 文字コード:ANSI 保存場所はデスクトップ です どうすれば開けるようになるのでしょうか。
- ベストアンサー
- C・C++・C#
- 複数ファイルの同時読み込みの方法と脱初心者向け参考書
ループにて、複数のファイル(.txt)を同時に読み込む方法はあるのでしょうか。(厳密に言えば、完全に同時ということではなく、時間差をつけてということ)。以下のプログラムではループ自体が行われていないようでした。while分とfreadの使い方に問題があると思うのですが… ~略~ int a,b; FILE *fp1,*fp2; fp1 = fopen(…,"r"); if(fp1 == NULL) {・・・;} fp2 = fopen(…,"r"); if(fp2 == NULL) {・・・;} while((a = fread(…,1,8,fp1)) != 0) { while(fread(…,1,8,fp2)) { ~略~ } } fclose(fp1); fclose(fp2); 以下略~ また、2つ目のwhileを削除し次のようにすると1つ目のファイル(fp1)は読み込めるのですが、2つ目のファイル(fp2)が読み込めていないようでした。 ~略~ while((a = fread(…,1,8,fp1)) != 0) { b = fread(…,1,8,fp2); 以下略~ 解決方法を教えていただけないでしょうか。 次にいわゆる脱初心者向け(?)ともいえる参考書について。 初心者向けの入門書に載っている関数についての説明などは、どれも最も基本的な機能についてのものがほとんどで、少し応用したものは載ってません。 また、多少上級向けになると、例えば「int sprintf(char *buf,const char *format,…)」や、「int printf(const char *format,…)」といった具合にいかにも専門書らしくなっています。また使用例も、他に見たこともない関数が同時に出てきてまるで手がつけられません。 それはそれで重要なことであるのはわかるのですが、「sprintf(s,"%d%d",a,b) s文字配列、a,b整数値」という理解しやすい書き方をあわせて載せてある、「関数辞典」みたいな参考書とかは市販されているのでしょうか。私の理想通りの物とまでは言いませんが、お薦めのものを推薦していただければ幸いです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 2018年に外付ハードディスクに保存していた宛名職人のファイルを2022年4月に開こうとしたらI/Oエラーで開けませんとなってしまいます。
- 同じく2018年に保存していた他のファイルは開けるのですが、一番開きたいファイル(約2000件分の住所録です)だけがエラーが出て開けません。
- どうやったらデータを開くことができるでしょうか。他の開けているファイルは800件など開けないファイルよりは軽いファイルです。
お礼
ご回答ありがとうございます。ご指摘の方法にて解決できました。