• ベストアンサー

Visual C++で

VisualC++を使って、ファイルにint型の二次元配列を書き込みたいのですが、WriteFile関数を使えばよいのかな?というところまではわかったのですが、二番目の引数を"int"型から"LPCVOID"型に変形できませんと言われてしまいます。 雰囲気的には下のような感じになるのかなぁー、と思いましたが、わかりません。教えてください。お願いします。 fp = CreateFile("test.dat", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); for(i = 0; i < 100; i++){ for(j = 0; j < 100; j++){ WriteFile(fp, array[i][j], sizeof(array), &dwRote, NULL); } }

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

  • ベストアンサー
  • YamaYoshi
  • ベストアンサー率29% (91/313)
回答No.1

C言語標準じゃだめなの? FILE *fp; fp = fopen("test.dat", "w"); for(int i = 0; i < 100; i++) {  for(int j = 0; j < 100; j++)  {   fprintf(fp, "%d", array[i][j]);  } } fclose(fp);

candlefire
質問者

お礼

ご回答ありがとうございます。 VC++で普通にC言語の関数が使えるのを知りませんでした。(^^;)おかげさまで解決しました。どうもありがとうございました。

その他の回答 (1)

回答No.2

arrayの宣言は、 int array[100][100]; って感じですか? WriteFileの第二引数はポインタである必要がありますが、array[i][j]は普通の値です。 その違いから、エラーが発生しています。 とりあえずエラーを発生させない為には、array[i][j]の値ではなくポインタを渡してあげてください。 >また他にも思い通りにいかない点もあるかもしれませんが・・そうしたら補足なり、別質問なりで投げてください。 ファイル出力で一番簡単なのは、#1さんがおっしゃっているfprintf()を使ってしまうことですね。

candlefire
質問者

お礼

ご回答ありがとうございます。なるほどーー、ポインタを渡せばよいわけですね。分かりました!!まだまだ、VC++ははじめたばかりなので分からない事ばかりですが、これから勉強していきたいと思います。ありがとうございました。

関連するQ&A

  • C#でポインタのポインタを作りたい

    昔VC++で作ったDLLをC#で使おうと思ったのですが、なんと、その引数がint**型です。 やっていることは、intの配列がありまして、その配列の特定の要素のアドレスを納めた配列を使っています。 具体的には(型や関数記述は大まかに書きます) --------------------------------- int **array; int *item; array = calloc(10, sizeof(int)); item = calloc(1000, sizeof(int)); for (i = 0; i < 10; i++) { array[i] = item + i+100; } --------------------------------- とした、arrayを引数にしています。 これをC#から使おうとして、C#ではint**をどうするんだろうと思った次第です。 わからないのは、C#でどうやってアドレスを配列に入れるかです。 array[i] = &item[width*i] とすると、コンパイル段階で怒られてしまいますし... 知恵をお貸しください。

  • プログラム(C)

    #include <stdio.h> #include <stdlib.h> #define FNAME "smp.bmp" #define WSIZE 256 #define HSIZE 256 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { ・   ・ }; struct BMPINFOHEADER { ・   ・ }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("ファイルをオープンできません\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose; return 0; } このプログラムはBMP画像を読み込むプログラムなんですが このプログラムに画素値を出力するプログラムにしたいのですがうまくできません。 結果は(真っ白な画像の時)255255255・・・255255と出力したいのです。白黒画像なのでR=G=Bで1画素値は255だけでいいのですが。どうしても255255255や25500などとでてしまいます。 アドバイスお願いします。(800字までなので構造体の宣言は抜いてしましました) 。

  • C言語で半角スペースをデリミタとしたデータファイルを読み込むプログラム

    C言語で半角スペースをデリミタとしたデータファイルを読み込むプログラムを作っています. まず, データのレコード数とフィールドの数をカウントしてその後, double型の2次元配列に必要なメモリ領域をmalloc関数にて確保して, 2次元配列にデータを代入していくという処理をやらせています. とうプログラムをコンパイルして実行した所以下のようなエラーが出てどうやらFreeを2重にしてしまっていることがエラーログから分かるのですが, どこを修正していいかわかりません. どなたかお力を貸していただけないでしょうか? ■ソース■ #include<stdio.h> #include<string.h> #include<malloc.h> #define LINE_MAX_SIZE 5120 int main(void){ __road("test.dat"); } int road(char fname[100]){ __FILE *fp; __char line[LINE_MAX_SIZE]; __char *tp; __char *token=" "; __int rn=0; __int fn; __int i=0; __int j=0; __ __fp=fopen(fname,"r"); ____/* ____ check record number and field number ____*/ ____while(fgets(line,sizeof(line),fp)){ ______ ______tp=strtok(line,token); ______fn=0; ______while(tp!=NULL){ ________tp=strtok(NULL,token); ________fn++; ______} ______rn++; ____} ____//printf("rn=%d fn=%d\n",rn,fn); ____/* ______make 2 dimension array dynamically ____*/ ______double **data; ______ ______data=malloc(sizeof(double *)*rn); ______// then data have 2 pointer to double type ______for(j=0;j<fn;j++){ ________data[j]=malloc(sizeof(double)*fn); ______} ____ ____/* ____ insert data to array ____*/ ____i=j=0; ____while(fgets(line,sizeof(line),fp)){ ______j=0; ______tp=strtok(line,token); ______data[i][j]=atof(tp); ______while(tp!=NULL){ ________j++; ________tp=strtok(NULL,token); ________data[i][j]=atof(tp); ______} ______i++; ____} ____for(i=0;i<rn;i++){ ______for(j=0;j<fn;j++){ ________printf("%f ",data[i][j]); ______} ______printf("\n"); ____} ____/* ____/ free memory for data[][] ____*/ ____if(data){ ______for(j=0;j<fn;j++){ ________if(data[j]){ __________free(data[j]); ________} ______} ______free(data); ____} __fclose(fp); } /* int freeMem(){ } */

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • フレーム画像の連続保存について

    現在、USBカメラから撮ったフレーム画像を保存するといったプログラムを作成しています。やりたいのはUSBカメラから撮った全てのフレーム画像(例:300フレーム=300枚画像)の保存ですが、今はキーボートを押されるたび画像の保存しかできない状態です。とっても困っています。どうか教えていただけませんか?よろしくお願いします。 while(1){ int v = 0; hr = pGrab -> GetCurrentBuffer( &n, (long *)buffer );// グラブ if( kbhit() ){  getch();//kbhitで取得したキーの破棄  hr = pMC -> Pause(); memset(&bmphdr, 0, sizeof(bmphdr));  bmphdr.bfType = ('M' << 8) | 'B'; bmphdr.bfSize = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER) + n; bmphdr.bfOffBits = sizeof(bmphdr) + sizeof       (BITMAPINFOHEADER);  while(1){ v++; char filename[300];   _snprintf(filename, sizeof(filename),"%d.bmp", v); fh = CreateFile(filename,GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL); WriteFile(fh,&pVideoHeader->bmiHeader, sizeof(BITMAPINFOHEADER), &nWritten, NULL); WriteFile(fh, buffer, n, &nWritten, NULL); CloseHandle(fh); pMC -> Run(); pGrab -> SetBufferSamples(FALSE); if(kbhit()){ break; }  }  printf( "グラブ停止:終了 -- 0 、再開 -- 1 、処理 -- 2\n" );  scanf("%d",&num); }

  • scanf C言語

    現在取得したデータを多次元配列いれたいのですが、カンマまでの文字列を入れる方法がわかりません。例で言いますと jgasogasog,dklafh343,fdjalsjfd,kldjfas5 dfasfdas6ff ,fsadfa6sg,dgas6dsa,fsdafa もカンマまでの文字列array[0][0] = jgasogasog array[0][1] = dklafh34 といった形で入れていきたいです。 ご迷惑おかけしますが何卒よろしくお願いします。 途中まで作ったソースをのせます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 2 #define hoge 1400 int main(void) { FILE *fp; char test[10][500]; int n = 0; if ((fp = fopen("testfile.csv", "r")) == NULL) { printf("\aファイルをオープンできません\n"); return(0); } int i, j; int k = 0; //ファイルfpの終端指示子をチェックします。 while (!feof(fp) && k < 500) { //%cは一文字出力をしてくれる使用データ型はchar型 //fscanf関数は書式指定をしてファイルから値を読み込み、バッファに格納します。 for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { fscanf(fp, "%[^,],%d", &test[i][j]); k++; } } } for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { printf("test[%d][%d]=%d\n", i,j,test[i][j]); } } fclose(fp); return(0); } 似たような質問をしてすいません。

  • 書き込みデータのポインタのキャスト変換

    Ç言語初心者です。 あるプログラムソースの一部で、以下のようにfwrite()で書き込みデータのポインタarrayをキャスト変換しています。    FILE *fp; int array[3]; int i; for( i=0; i<3; i++){ array[i] = i; } fp = fopen("sample.tbl","wb"); fwrite( (char *)array, sizeof(array), 1, fp); // (char *)を付ける理由が分からない fclose(fp); (char *)array を array に変更しても結果は変わらないと思いますが、何に影響があるのでしょうか。

  • 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); } 途中経過もテキストファイルで出力したいのですが、このプログラムを実行すると最後の結果しか出力されません。 アドバイスをよろしくお願いします。

  • c言語で配列を返したい

    自分がc言語で書いているプログラムの関数で次のようなものがあるのですが、 int CTR(int data[], int* key, long long t){ int buf[sizeof(data)]; int tmp[16]; int bytesoft[128]; int i,j; KeyExpansion(key); for(i=0;i<sizeof(data);i+=16){ for(j=0;j<16;j++){ if(j<sizeof(bytesoft)) tmp[16-j-1]=bytesoft[sizeof(bytesoft)-j-1]; else tmp[16-j-1]=0; } Cipher(data); for(j=0;j<16;j++){ buf[i+j] ^= data[i+j]; } t=t+1; } return buf; } 配列bufを返すためには、ポインタを用いればいいということは調べて分かったのですが具体的にどのように書き換えればいいかよくわかりません。 どなたかご教授いただけないでしょうか?

  • Visual C++ 2005のデバッグエラーについて(コマンドライン

    コマンドラインを利用してファイルを読み込む類のプログラムを作っているのですが、コンパイルしてデバッグなしで開始をすると、エラーが出てしまいます。 調べようとしても原因がわからず困っています。 回答よろしくお願いします。 サンプルプログラム↓ コマンドラインでテキスト形式のファイルを読み込み、特定の部分を表示させたあとに、コマンドラインで指定したファイルに行を逆順にして書き込む・・・といった内容です。 こちらも途中までLinuxで作成、途中からVisual2005で編集・・・といった感じのプログラムです。 #include<stdio.h> #include<stdlib.h> #define LINE 1000 int main(void) { FILE *fp_in,*fp_out; char line[10][LINE]; char rv[10][LINE]; int i,j,k; fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } while(fgets(line[i],LINE,fp_in)!=NULL){ printf("%d\n",i); i++; } i=1; j=0; while(i<3){ if(i==1){ for(j=0; j<=6; j++){ printf("%c",line[i][j]); } } if(i==2){ for(j=11; j<=15; j++){ printf("%c",line[i][j]); } } i++;} fclose(fp_in); fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } fp_out=fopen("repurica.txt","w"); if(fp_out==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } i=0; k=0; while(line[i]!='\0'){ i++; } while(i<4 ){ rv[k++][LINE]=line[--i][LINE]; } rv[j][LINE]='\0'; printf("%s\n",rv); fclose(fp_in); fclose(fp_out); return 0; }

専門家に質問してみよう