• ベストアンサー

文字列とWriteFile関数について

char* に格納した文字列をWriteFile関数でテキストファイルにそのまま書き込もうとすると MessageBoxで表示したときは改行されていたのに、Notepadで見ると改行されていませんでした。 どうすればこの問題は解決しますか?

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

具体的にはどのような文字列を書き込もうとしたのでしょうか? 一つの可能性としては、改行として '\n' しか書き込んでいないというものでしょうか。 notepadは '\n' だけのものを改行とは認めず、改行するには '\r' + '\n' のならびにする必要があります。 MessageBoxでもWindowsのバージョンによって違ったりしますが、 '\r' + '\n' ではなく '\n' だけでも表示上で改行されます。 fprintf/fputsなどの関数だとテキストモードでファイルをオープンしていれば '\n' → \r\n の変換を自動でしてくれますが、WriteFileはそういったことは してくれません。

mozukux382
質問者

お礼

返事が遅れてすいません、ありがとうございましたおかげでうまくプログラミングができました。

関連するQ&A

  • WriteFile関数

    WriteFile関数 C言語でWindowsプログラミングを学習中です。 2点ご質問です。 LPTSTR型のbufferには(1)のように文字列を格納して、 画面に表示しています。 ファイルに保存するために改行は「\r\n」に置き換えているので、 画面上ではもちろん改行されません。 Editコントロールを使用すれば簡単にいくと思いますが、 このような方法で画面上にも改行・ファイルにも改行という方法はありますか? さらに(2)で保存したファイルを開くと文字と文字の間に半角のスペースが 入ってしまいます。 ごくたまに入らない時もありますが、文字列の一部しか表示されません。 これはUNICODEとマルチバイトの関係なのでしょうか? UNICODEを定義しています。 マルチバイトを定義してしまうとGetSaveFileName関数が エラーになってしまうので・・・ ご教授お願いします。 (1) case WM_CHAR: if(wp==VK_BACK){ if(!iCount) return 0; iCount--; InvalidateRect(hWnd,NULL,TRUE); }else if(wp==VK_RETURN){ buffer[iCount++]='\r\n'; InvalidateRect(hWnd,NULL,TRUE); return 0; }else{ buffer[iCount++]=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); } return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rc); DrawText(hdc,buffer,iCount,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・ (2) int MySave(LPTSTR buffer,HWND hWnd) { OPENFILENAME ofn; HANDLE hFile; TCHAR szFile[MAX_PATH]; TCHAR szFileTitle[MAX_PATH]; DWORD dwAccBytes; memset(&ofn,0,sizeof(OPENFILENAME)); ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hWnd; ofn.lpstrFilter=TEXT("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); ofn.lpstrFile=szFile; ofn.lpstrFileTitle=szFileTitle; ofn.nFilterIndex=1; ofn.nMaxFile=MAX_PATH; ofn.nMaxFileTitle=MAX_PATH; ofn.Flags=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY; ofn.lpstrDefExt=TEXT("txt"); ofn.lpstrTitle=TEXT("名前を付けて保存"); if(!GetSaveFileName(&ofn)) return -1; hFile=CreateFile(szFile,GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hFile,buffer,(DWORD)lstrlen(buffer), &dwAccBytes,NULL); SetWindowText(hWnd,szFileTitle); CloseHandle(hFile); return 0; }

  • 文字列の入れ替え

    2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作成せよ。ただし入替え処理には、関数swap_array(char [],char [])を作成して用いること。という問題なのですが、下記の実行例では、2つの文字列xとyをキーボードから入力し、入れ替えた後に表示している。 <実行例> % ./irekae 文字列x (20字まで)? Mojiretsu 文字列y (20字まで)? Irekae 関数swap_array()を呼び出しました 入替後の x: "Irekae" 入替後の y: "Mojiretsu" % となっているのですが文字列を格納するところまでしかわかりません。 どなたか教えていただけないでしょうか? #include<stdio.h> int main(void) { char x[21]; char y[21]; printf("文字列 (20字まで)? "); scanf("%s", x); printf("文字列 (20字まで)? "); scanf("%s", y);

  • 文字列検索について

    文字列から検索対象文字がいくつあるかカウントする関数はありますでしょうか? strTest という変数からchar(10)の改行文字のカウントをしたいのですが。

  • C言語:小文字を大文字に変換する関数を作成

    C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。

  • 改行文字を消す方法を教えて頂けませんか。

    こんにちは。 C言語で、改行まで文字列として格納した変数から、改行のみを削除する事は可能でしょうか。構想としては、 char *str = "text改行" ↓ 改行部分を削除 ↓ str == "text" になるのがベストです。 良い方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • 関数が呼び出されるごとに文字列(IPアドレス)を格納したいのですが・・・

    こんばんは。 関数が呼び出されるごとに文字列(IPアドレス)を格納したいと思っているのですが、どのように記述すればよいか分かりません。 以下にプログラムを示します。 以下のプログラムは、int UDPReceive_IPaddr関数のwhileループ内のIPaddrstorage関数が呼び出されるたびに、IPaddrstorage関数内にて配列を用いて他の端末のIPアドレスを格納したいと考えています。 しかし、関数が毎回呼び出されるため、配列の記述の仕方に困っています。なにか解決方法はありますでしょうか? [プログラム] int UDPReceive_IPaddr(u_short portNo) { char IPaddr[16]; int size; //他の端末からIPアドレスをHELLO文字列(パケット)を受信することで知る。 while(1){ if(size == 5){ if(memcmp(recv_Buf,"HELLO",5) == 0){ strcpy(IPaddr,inet_ntoa(from.sin_addr)); IPaddrstorage(IPaddr); } } } int IPaddrstorage(char *IPaddr){ //配列を用いて、他の端末のIPアドレスを格納したいと考えています。 return 0; } よろしくお願いします。

  • 文字列からの関数を呼び出す。

    題名のとおり、文字列から関数を簡単に呼び出せる方法を考えています。  現在、考えている方法は、ファイルへ、その文字列を書き込み、書き込み終了後、そのファイルを呼び出す方法しか考えつきません。この方法では、複数ユーザーからアクセスがあった場合に、ファイルのユニーク等の問題で、複雑になることが考えられます。  他に、文字列から関数を簡単に呼び出す方法をご存知でしたら、教えてください。お願いいたします。  ちなみに、VBScriptで試して、OKだったら、他の言語にも適用しようと考えています。  質問がわかりづらいかもしれませんが、ご回答お願い致します。

  • 可変個引数を使った関数で文字の長さを知りたい

    可変個引数を使った引数を使って引数の文字列の長さを知りたいのですがどうすればいいのかわかりません。 DXライブラリを使って文字列の長さを測って文字をどこにおくのかを決めているため文字列の長さがわからないと困ってしまいます。 どのようにすれば可変個引数を使った引数の文字列の長さを測れますか? 大体以下のような感じで作っています。 void kai( int *x , int *y ); //文字列を改行する関数 int JC( unsigned char code ); //文字が1バイト文字 か 2バイト文字か判別する void mozi_show2( int x , int y , int xm , int yb , int color , int char_set , const char *s , ... ){   int i = 0;   int xs = 0 , ys = 0;   int m_color = color;   char One[ 2 ]; //1バイト文字格納用   char Two[ 3 ]; //2バイト文字格納用   const char* p;   va_list args;   va_start( args , s );   p = s;   while( *p != '\0' ){     switch( *p ){       case '%':         p++;         assert( *p != '\0' );         switch( *p ){           case 'd':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%d" , va_arg( args , int ) );             //purintfと使い方はほぼ同じで左から文字を表示したいX座標・文字を表示したいY座標             //文字の色・文字の書式・格納用文字列・表示したいint型の数値をあらわしています             xs += 16;             /*             xs += GetDrawFormatStringWidthToHandle( char_set , "%d" , va_arg( args , int ) );             本来ならこの関数を使って文字列の長さを計る左から             文字列の書式・格納用文字列・長さを測りたいint型文字列             これを使うと別のものを計っているみたいで文字の長さがわからない             文字の長さってどうやって計るの?             */             break;           case 'f':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%f" , va_arg( args , double ) );             break;           case 'c':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%c" , va_arg( args , char ) );             break;           case 's':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%s" , va_arg( args , const char* ) );             break;           case '%':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%%" );             xs += GetDrawStringWidthToHandle( "%" , 1 , char_set );             break;         }         p++;         break;       default:         if( JC( *p ) ){           Two[ 0 ] = *p;           Two[ 1 ] = *( p + 1 );           Two[ 2 ] = '\0';           DrawStringToHandle( x + xs , y + ys * yb , Two , m_color , char_set );           xs += GetDrawStringWidthToHandle( Two , 2 , char_set );           p += 2;         }         else{           One[ 0 ] = *p;           One[ 1 ] = '\0';           DrawStringToHandle( x + xs , y + ys * yb , One , m_color , char_set );           xs += GetDrawStringWidthToHandle( One , 1 , char_set );           p++;         }         break;     }     if( xs > xm ){       kai( &xs , &ys );     }   }   va_end( args ); } void zitu_draw( void ){   char *str = "%d個 OK";   int i = 12;   mozi_show2( 100 , 100 , 300 , 15 , red_s , MG_14_0 , str , i );   //左から 文字を表示するX座標・文字を表示するY座標・文字を改行する文字列の長さ   //改行した時のY座標の縦幅・文字色・文字の書式・表示したい文字列・%dに表示したいint型の値 }

  • 読み込んだ文字列を関数として実行するには?(VC++)

    [やりたい事]  (1)テキストファイルを読込む    ※テキストには関数名が記述されてます。  (2)取得した関数を実行する。 [できない事]  (1)はできたのですが、(2)ができない。  取得した文字列をどうやれば関数として実行できるのか、分からず悩んでます。 回答よろしくお願いします。

  • 変数内の文字列を空にできない

    ファイルに文字列を改行などを加えながら格納し、条件にそってファイルから取り出し表示します。 その後ファイルの中身、取り出しと表示に使った変数を空にしたいと思って作ったwindowsプログラムの一部で下記のようにしているのですが 一回目のoutを表示すると正しく表示されるのですが それ以降,前の文字列が半端に混じって表示されます。 word.txtの中身は空になってるのを確認したのですが woかoutの中身が綺麗にクリアされていないみたいです。何故でしょうか? 解決策を教えて下さい、お願いします。 FILE *words; int a; char lo[256], wo[256], out[256]; //文字列をファイルに出力 words = fopen("word.txt" , "a") fprintf(words , lo); if(a>0) fprintf(words, "\n"); else fprintf(words , " "); fclose(words); //ファイルから指定サイズの要素を入力 words=fopen("word.txt", "r"); fread( wo, sizeof( char ), 256, words ); wsprintf(out, "%s", wo); //DrawTextへ fclose(words); //ファイルの中身を破壊 words=fopen("word.txt", "w"); fclose(words); //変数内の文字列を消す strcpy(out, ""); strcpy(wo, "")

専門家に質問してみよう