• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Win32APIプログラムで困っています)

Win32APIプログラムで初期化ファイルに保存できない問題

このQ&Aのポイント
  • Win32APIプログラムで初期化ファイルに保存する際、同じキーのところに何度も保存されてしまう問題が発生しています。
  • 初期化ファイルに問題があるのか、他に原因があるのか分からず、困っています。
  • 初心者のため、単純なミスかもしれませんが、解決策がわかりません。助けていただけると幸いです。

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

  • ベストアンサー
回答No.1

if(szBuf == TEXT("nothing")){ が意図したとおりに動作しない原因のようですね。 szBuf の先頭アドレスと、文字列 TEXT("nothing") の先頭アドレスとの比較になっています。(当然、FALSE となります。) _tcscmp() 等で比較を行いましょう。

jaron
質問者

お礼

おおおおおおお!! できました!ありがとうございます!! そう言われてみればアドレスの比較になってしまっていますね・・。 なんだか簡単なミスで恥ずかしいです。 これからはこういうこともしっかり考えてプログラムしていきたいと思います。 tsukasa-12rさん本当にありがとうございました! これほど迅速に回答して頂けるとは感謝の念でいっぱいです。 これからもお世話になることがあるかもしれませんが、そのときはまたよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Win32API ファイルの書き込み、保存

    Win32APIを使って、ファイルの保存ダイアログを表示→ファイルを指定→保存ボタンを押す→指定されたファイルに書き込む→指定したファイルを保存 というプログラムを作りたいと考えています。しかし、ファイルに書き込んだ後どう保存すればいいかわからないので教えてください。s[256]をfilename_fullに書き込んで保存したいです。この場合プログラムは抜粋したものなので、s[256]に文字が格納してあると考えてください。 char s[256]; FILE *fp; static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetSaveFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }else{ if((fp=fopen(filename_full,"w")) == NULL) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); exit(0); /* (3)エラーの場合は通常、異常終了する */ } /*ここからがわかりません*/     /*s[256]をファイルに書き込んで、保存するプログラムを教えてください。

  • jsの変換プログラムで、泉ケ丘のケをgaに変換

    https://hebonshiki-henkan.info/ 上のhpをもとにして作っています。 例えば、ひらがなのあや、カタカナのアは、aと認識します。 以下のjs文のままだと、新たに、深井→FUKAIと設定した場合はプログラムは正常に動くのですが、 泉ケ丘と、カタカナのケを使った場合、単体のケと認識されて、 keと入力されてしまいます。 これをgaと認識させるには、どのようなプログラムにすればいいのでしょうか。 以下はjs文です。 function ToHebon(){var map={"あ":"a","い":"i","う":"u","え":"e","お":"o", "か":"ka","き":"ki","く":"ku","け":"ke","こ":"ko", "さ":"sa","し":"shi","す":"su","せ":"se","そ":"so", "深井":"FUKAI", "泉ケ丘":"IZUMIGAOKA", "ー":"" }; var temp_data="";var temp_data2="";var temp_data3="";var temp_data4="";var temp_data5="";var temp_data6=""; var temp_data7="";var temp_data8="";var temp_data9="";var temp_data10="";var roma_data=""; var result_data="";source_data=document.form1.input_text.value; for(i=0;i<source_data.length;i=i+1) {temp_data=source_data.substring(i,i+1); temp_data2=source_data.substring(i,i+2); if(map[temp_data2]===undefined){ if(map[temp_data]===undefined) {roma_data=roma_data+temp_data} else{roma_data=roma_data+map[temp_data]}} else{i=i+1;roma_data=roma_data+map[temp_data2]}} for(i=0;i<roma_data.length;i=i+1){ temp_data=roma_data.substring(i,i+1); temp_data2=roma_data.substring(i,i+2); temp_data3=roma_data.substring(i,i+3); temp_data4=roma_data.substring(i,i+4); temp_data5=roma_data.substring(i,i+5); temp_data6=roma_data.substring(i,i+6); temp_data6=roma_data.substring(i,i+7); temp_data6=roma_data.substring(i,i+8); temp_data6=roma_data.substring(i,i+9); temp_data6=roma_data.substring(i,i+10); sub_str2=temp_data2.substring(1,2); if(temp_data4=="noue"){i=i+3;temp_data="noue"} else if(temp_data6=="touchi"){i=i+5;temp_data="touchi"} else{if(temp_data2=="uu"||temp_data2=="ee"||temp_data2=="ou"||temp_data2=="oo"){i=i+1} else if(temp_data2=="nb"||temp_data2=="nm"||temp_data2=="np"){temp_data="m"} else if(temp_data=="っ"||temp_data=="ッ"){if(temp_data3=="っch"||temp_data3=="ッch"){temp_data="t"} else if(sub_str2.match(/[a-z]/gi)){temp_data=sub_str2}else{temp_data="tsu"}}}result_data=result_data+temp_data} if(document.form1.uplow[0].checke

  • WritePrivateProfileString

    Visual C++で、 unsigned char*型の変数を、一旦ファイルに保存しておいて、 後にそれを読み込んで使用する、ということをしたいのですが、 GetPrivateProfileStringとWritePrivateProfileStringを利用しようと考えました。 具体的にはPC-OP-RS1という製品を使った、 テレビのリモコンプログラムなんですが、 このデバイスの操作APIが、 赤外線信号をunsigned char*型で受け取ります。 これをファイルに記述しておいて、 好きなときに呼び出したいのですが、 前述の2つの関数は、 渡せる方がLPCTSTR型となっていますが、これがよくわかりません。 どうすれば実現できるでしょうか? 別の方法を取ったほうがいいでしょうか?

  • 検索させるプログラムです。

    文字列を入力させて、その後に検索キー入力をし、先ほど入力した文字列のなかから 一致するものを検索するプログラムです。 #include <stdio.h> int searchidx(char a[],char key) { int i=0,j=0; a[3]=key; for(i=0;i<3;i++){ if (a[i] == key){ j++; break; } } if(j==0){ return(-1); }else{ return(i); } } int main(void) { int a,i; char ky=0; char x[3]; printf("3個の文字を入力してください。\n"); for (i = 0; i < 3; i++) { printf("x[%d]:", i); scanf("%s", &x[i]); } printf("検索キー:"); scanf("%s", &ky); a=searchidx(x,ky); if (a == -1){ puts("一致しません。"); }else{ printf("%d\n",a); printf("%s\n",x[a]); } } メイン関数で文字列を入力させ、その配列とキー値をサーチ関数に渡して 一致した時の配列の添え字をaに返してメイン関数で文字列の配列のその添え字x[a]で表示されるのではないか?と思ってそうしてるつもりなのですが 実行してみると最後の一致した結果を表示させるところでエラーがでます。 表示させるところの前のprintfで一致するものの要素数が帰ってくるかどうかのチェックを入れてますが ちゃんと添え字番号は正しく返ってくるのになぜ最後の printf("%s\n",x[a]); ではダメなのでしょうか? それとscanfって%sのときは&いらなかったと思うのですが この場合&を入れないとエラーになってしまいます。

  • 配列v2を逆順にしてv1に格納するプログラム

    こんにちは。  下記は関数 intary_rcpy を使用して、配列 v2 の要素の順序を逆にして配列 v1 に格納するプログラムです。 関数の中で v1[0] = v2[4] v1[1] = v2[3] .... と代入して、要素の順序をひっくり返そうと考えています。 想定している実行結果は 5, 4, 3, 2, 1 ですが、 実際の実行結果は 0, 5, 5, 5 となってしまいました。 関数部以外の問題のようにも思うのですが、どう間違っているのか ご指摘いただける点がありましたら、お願いいたします。 ========================================= #include <stdio.h> void intary_rcpy(int v1[], const int v2[], int no) { int i; for(i = 0; i < no; i++) v1[i] = v2[no - 1]; no--; return(v1); } int main(void) { #define NUMBER 5 int i; int v1[] = {}; int v2[] = {1,2,3,4,5}; intary_rcpy(v1, v2, NUMBER); for(i = 0; i < (NUMBER - 1); i++) printf(" %d \n", v1[i]); return 0; } ========================================= 以上。

  • このプログラムの説明合っていますか?

    /* 線形探索(for文で実現)*/ #include <stdio.h> /*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/ int search(const int a[], int n, int key)    { int i;            /*iを宣言*/ for (i = 0; i < n; i++)     /*iの値を設定し宣言*/ if (a[i] == key)       /*iにkeyで入力*/ return (i); /* 探索成功 */ return (-1); /* 探索失敗 */ } int main(void)          /*main関数*/ { int i, ky, idx;/*i,ky,idxを宣言*/ int x[7]; /*xは配列で7つの数字を入れられる*/ int nx = sizeof(x) / sizeof(x[0]);/*配列を宣言*/ printf("%d個の整数を入力してください。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d]:", i); scanf("%d", &x[i]); }printf("探す値:"); scanf("%d", &ky); idx = search(x, nx, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); return (0);      /*0の数字で戻る*/ } 1行ずつ理解したいのですが分からない個所多いんです。 分からないの文は説明が書いてないので教えてください。

  • このプログラムどこがおかしいですか?

    コンパイルはできますが実行できません… どこがおかしいか分かる人教えてください。 このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。 #include <stdio.h> #include <string.h> #define NUMBER 10 //構造体を宣言する struct student { //名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義 char name[10]; char math[4]; char eng[4]; }; /*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/ int search(struct student *b, int n, char key) { int i=0; b[i].name[0]=key; // 番兵を追加 while (1) { if (b[i].name[0] == key) break; /* 見つけた */ i++; } return (i == n ? -1 : i); } int main(void) { FILE *fpin; struct student a[NUMBER]; int i=0, idx,ret; char buffer[20],ky; int nx=sizeof(buffer) / sizeof(buffer[0]); fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=100) break;//読み込む人数が100人を超えてる時の処理 ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割 if(ret!=3) //3に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; } printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng); i++; } printf("探す値:"); scanf("%s", &ky); idx = search(a, nx - 1, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); END: fclose(fpin); return 0; }

  • VBのプログラム

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 20 + 70 tb.Left = (j - 1) * 50 + 60 * (columns * (k - 1)) + 5 tb.Width = 55 Next Next Next End Sub これはボタンを押すと テキストボックスに入力された値分だけテキストボックスが出てくるというものです。 例えば 3 4 4とテキストボックスに値が入力された場合 3行4列が4個分テキストボックスが出てきます。 しかし6 6 6と入力した場合画面に入りきらなくなってしまいます。 大きな値を入力しても画面に入れたいです。 これはスクロールなどしてできるようにしたいです。 どのようなソースでできるのでしょうか。

  • プログラムのフローチャートがかけません。

    次のプログラムのフローチャート(流れ図)を書いてください。お願いします。 フローチャートの書き方は以下のwebから見れます。 http://sasuke.main.jp/furo.html #include<stdio.h> #include<math.h> #include<stdlib.h> #define MAX_DATA_NUMBER 400 int check_value(int x, char* error_message); int main(int argc ,char*argv[]){ int M=0 ,i=0,N,U double x[2][MAX_DATA_NUMBER],y_bunshi FILE *in_file; in_file = fopen(argv[1],"r"); M = 0; if(argc != 3){ printf("使い方: ./smooth 入力データファイル名 平滑化数N"); exit(1); } N = check_value(atof(argv[2]),"平滑化数は正の値を入力してください。\n使い方: ./smooth 入力データファイル名 平滑化数N"); if(argc == 3){ if( in_file == NULL){ printf("使い方: ./smooth 入力データファイル名 平滑化数"); exit(1); } } while( EOF != fscanf(in_file, "%lf", &x[0][M]) && M<MAX_DATA_NUMBER){ M++; } fclose(in_file); for(i=0;i<=N-1;i++){ y_bunshi = 0; for(U=0;U<=i+N;U++){ y_bunshi += x[0][U]; } x[1][i] = y_bunshi/(i+N+1); } for(i=N;i<M-N;i++){ y_bunshi = 0; for(U=1;U<=N;U++){ y_bunshi += x[0][i+U]; y_bunshi += x[0][i-U]; } y_bunshi += x[0][1]; x[1][i] = y_bunshi/(2*N+1); } for(i=M-N;i<=M-1;i++){ y_bunshi = 0; for(U=i-N;U<=M-1;U++){ y_bunshi += x[0][U]; } x[1][i] = y_bunshi/(M+N-i); } for(i=0;i<M;i++){ printf("%3d,%8.2f,%8.3f\n",i,x[0][i],x[1][i]); } return 0; int check_value(int x,char* error_message){ if( x <= 0.0){ printf(error_message); exit(1); return x; }

  • 0x8, スペース, 0x8をプログラムで組むと

    『scanfを使わずに_getch()でキーボードからファイル名を入力していき、入力した文字をprintfで表示する流れについて質問です。 表示された文字をバックスペースで消していっても打ち込んだ文字は消えないですよね? 間違ったファイル名を入力してしまった際に文字が残っているので、正しく入力し直しても間違ったファイル名となってします。 一度打った文字を消す方法はありますでしょうか? 』 以前このような質問をさせていただき、_getch()で得た文字のキーボード上での削除の仕方は分かりました。 今度はそのやり方をプログラムで作るとしたら、どう組んでいけば良いのか教えて頂けないでしょうか。 できればそのプログラムを教えて頂けたら嬉しいです。 今現在書いてるプログラムのgetchを使っている部分です。 ファイルがオープンできたら別の処理に移行しますが、その関数は長くなるので省略しています。 #include <stdio.h> #include <conio.h> int main() { int key; int i; char file_name[256] = { 0 }; FILE *fp; errno_t e; while(1) { i = 0; // エンタキーが押されるまで入力を続ける do { printf("%c", key); file_name[i] = key; key = _getch(); i++; } while(key != 0x0d); printf("\n"); if(e = fopen_s(&fp, file_name, "rb") != 0) { printf("ファイルが存在しません\n"); return 0; } else { // 成功したらプログラムの処理をする関数に移行 return 1; } } }