C++ファイル読み込み部分のコードと意味について

このQ&Aのポイント
  • C++のファイルの読み込みの部分で"r"のコードは何を意味するのか
  • enemydata.csvファイルを読み込むC++のコードの一部に"r"という文字列がありますが、これはファイルの読み込みモードを指定するものです。
  • モード"r"はファイルを読み取りモードで開くためのものであり、ファイルからデータを読み込む際に使用されます。
回答を見る
  • ベストアンサー

C++のファイルの読み込みの部分で質問があります。

fp = fopen("enemydata.csv","r");の部分のコードで "enemydata.csv"のファイルを読み込むのですが "r"の部分が何を意味しているのがわかりません。 以下のコードの他にも enemy.cpp enemy.h がありますが関連するものが見あたりません。 "r"の部分のコードは以下に表示します。 よろしくお願いします。 control.cpp #include "pch.h" #include "control.h" CONTROL::CONTROL() { player = new PLAYER; back = new BACK; FILE *fp; ENEMYDATA data[ENEMY_NUM]; char buf[100]; int c; int col=1; int row=0; memset(buf,0,sizeof(buf)); ここの部分→fp = fopen("enemydata.csv","r"); //ヘッダ読み飛ばし while(fgetc(fp)!='\n'); while(1){ while(1){ c=fgetc(fp); //末尾ならループを抜ける。 if(c==EOF) goto out; //カンマか改行でなければ、文字としてつなげる if(c!=','&& c!='\n') strcat(buf,(const char*)&c); //カンマか改行ならループ抜ける。 else break; } //ここにきたということは、1セル分の文字列が出来上がったということ switch(col){ //1列目は敵種類を表す。atoi関数で数値として代入。 case 1: data[row].type=atoi(buf); break; //2列目は弾種類。以降省略。 case 2: data[row].stype=atoi(buf); break; case 3: data[row].m_pattern=atoi(buf); break; case 4: data[row].s_pattern=atoi(buf); break; case 5: data[row].in_time=atoi(buf); break; case 6: data[row].stop_time=atoi(buf); break; case 7: data[row].shot_time=atoi(buf); break; case 8: data[row].out_time=atoi(buf); break; case 9: data[row].x=atoi(buf); break; case 10: data[row].y=atoi(buf); break; case 11: data[row].speed=atoi(buf); break; case 12: data[row].hp=atoi(buf); break; case 13: data[row].item=atoi(buf); break; } //バッファを初期化 memset(buf,0,sizeof(buf)); //列数を足す ++col; //もし読み込んだ文字が改行だったら列数を初期化して行数を増やす if(c=='\n'){ col=1; ++row; } } out: //敵クラス生成 for(int i=0;i<ENEMY_NUM;++i){ enemy[i]=new ENEMY( data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); } } void CONTROL::All() { //int count = 0; //描画領域を指定 SetDrawArea(MARGIN,MARGIN,MARGIN+380,MARGIN+460); back->All(); //プレイヤークラスのAll関数実行 player->All(); for(int i=0;i<ENEMY_NUM;++i){ if(enemy[i]!=NULL){ if(enemy[i]->All()){ delete enemy[i]; enemy[i]=NULL; } } } ++g_count; } CONTROL::~CONTROL() { //プレイヤークラスの解放 delete player; delete back; for(int i=0;i<ENEMY_NUM;++i){ if(enemy[i]!=NULL){ delete enemy[i]; } } }

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

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

r:読み込みファイル w:書き込みファイル a:追加書き込みファイル です。rなのにwにしてしまうとファイルが消されてしまいますので、注意。

bari-kinki
質問者

お礼

簡潔に教えていただきありがとうございます。 またよろしくお願いします。

その他の回答 (1)

回答No.1

> "r"の部分が何を意味しているのがわかりません。 "read(読む)" ためにファイルを開けろ、を意味します。 マニュアルを読みましょう。

参考URL:
http://msdn.microsoft.com/ja-jp/library/yeby3zcb(v=vs.90).aspx
bari-kinki
質問者

お礼

ありがとうございます。 ひととおりマニュアルを読み新たに気がついた部分 などがありためになりました。 また見かけたらよろしくお願いします。

関連するQ&A

  • 同じコードがある初期化について教えてください。

    シューティングゲームのサンプルを勉強しています。 下記のこの部分のコードが二つあります。 memset(buf,0,sizeof(buf)); 気になっています。 なぜ二つあるのかを意味を知りたいです。 よろしくお願いします。 コードは以下に記述します。 CONTROL::CONTROL() { player = new PLAYER; back = new BACK; FILE *fp; ENEMYDATA data[ENEMY_NUM]; char buf[100]; int c; int col=1; int row=0; memset(buf,0,sizeof(buf)); fp = fopen("enemydata1.csv","r"); while(fgetc(fp)!='\n'); while(1){ while(1){ c=fgetc(fp); if(c==EOF) goto out; if(c!=','&& c!='\n') strcat(buf,(const char*)&c); else break; } switch(col){ case 1: data[row].type=atoi(buf); break; case 2: data[row].stype=atoi(buf); break; case 3: data[row].m_pattern=atoi(buf); break; case 4: data[row].s_pattern=atoi(buf); break; case 5: data[row].in_time=atoi(buf); break; case 6: data[row].stop_time=atoi(buf); break; case 7: data[row].shot_time=atoi(buf); break; case 8: data[row].out_time=atoi(buf); break; case 9: data[row].x=atoi(buf); break; case 10: data[row].y=atoi(buf); break; case 11: data[row].speed=atoi(buf); break; case 12: data[row].hp=atoi(buf); break; } memset(buf,0,sizeof(buf)); ++col; if(c=='\n'){ col=1; ++row; } } out: for(int i=0;i<ENEMY_NUM;++i){ enemy[i]=new ENEMY( data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); } }

  • c言語についての質問です

    #include<stdio.h> #define N 3 void inputAns(int *row,int *col,int data[][N]); void printAns(int ID,int data[][N]); int main(){ int row[N]={2,3,6},col[N]={8,5,3},answer[N][N]; int i,ID; printf("Input your ID number :\n"); scanf("%d",&ID);inputAns(row,col,answer); printAns(ID,answer); return(1); } void inputAns(int *row,int *col,int data[][N]){ int i,j; printf(" Input Answers of matrxi Q :\n"); for(i=0;i<N;i++){ for(j=0; j<N; j++){ printf("%2d+%2d=",row[i],col[j]); scanf("%d",&data[i][j]); } } } void printAns(int ID, int data[][N]){ FILE *fp; int i,j; fp=fopen("ans.dat","a+t"); fprintf(fp,"%d\n",ID); for(i=0; i<N; i++){ for(j=0; j<N; j++) fprintf(fp," %3d",data[i][j]); fprintf(fp,"\n"); } fclose(fp); } この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 >./a.exe ID=50413001 [ 9/9 ] ID=50413002 [ 5/9 ] ID=50413003 [ 7/9 ] ID=50413004 [ 6/9 ] ID=50413005 [ 5/9 ] == correct rate === 4/5 3/5 5/5 5/5 1/5 4/5 4/5 1/5 5/5 =================== > 読み込むファイル(ans.dat)は以下のものです。 50413001 10 7 5 11 8 6 14 11 9 50413002 10 7 5 11 9 5 13 10 9 50413003 10 7 5 11 5 6 14 10 9 50413004 10 11 5 11 5 6 14 10 9 50413005 9 11 5 11 5 6 14 10 9 読み込みから集計がうまくいかず困っています。 どなたか教えてくれませんか?

  • csvファイルの読み込みで失敗します

    以下のようなソースでカンマ区切りのテキストファイルであるcsvファイルの行数、列数、要素数を取得するプログラムを作っているのですが、終わりのメモリ解放であるdelete []strのところでプログラムが落ちてしまいます。範囲外のメモリにアクセスしてしまっているのかと思いますが、ミスを特定できないので、教えてください。 読み込むcsvファイルには以下のような小数の値が入っています。 0.23960810421811729043, 11.753428210139766463, …(省略) , 3.8736893050771881164 int main( int argc, char **argv ) { int csvRowNum, csvColNum, csvElemNum; GetCSVDataNum ( "C:\\Data.csv", csvRowNum, csvColNum, csvElemNum ); return 0; } // csvファイルから行数、列数、要素数を取得する int GetCSVDataNum ( char *csv_name, int &rowNum, int &colNum, int &elemNum ) { FILE *fp; fp = fopen( csv_name, "r" ); if( fp == NULL ){ printf( "ファイルオープンエラー\n" ); exit(1); } // ファイルサイズの取得 int fsize; fseek( fp, 0L, SEEK_END ); fsize = ftell( fp ); // ファイルシーク位置を先頭に戻す fseek( fp, 0L, SEEK_SET ); // ファイルサイズに合わせて文字列領域確保 char *str; str = new char[fsize]; char buf[10000]; // ファイルから1行ずつテキストデータを読み込み、 // 連結してbufに格納する str[0] = '\0'; while ( fgets( buf, sizeof(buf), fp ) != NULL ) { strncat( str, buf, strlen(buf) ); } int countSep = 0; // '(カンマ)の数のカウント int cols = 0; // 各行の列数をカウント int countNL = 0; // 改行の数をカウント // 要素数、行数、列数の取得 for ( int i = 0; i < (int)strlen(str); i++ ) { switch( str[i]){ case ',': countSep++; cols++; break; case '\n': countNL++; cols++; // 各行で列数が異なるときは、最も大きい列数とする colNum = (colNum > cols ) ? colNum: cols; cols = 0; break; default: break; } } rowNum = countNL; elemNum = countSep + countNL; // strの解放で落ちる delete[] str; fclose( fp ); return 0; }

  • AVRによるマトリクスLED制御

    AVRによるマトリクスLED制御 この度大学でAVRによるマトリクスLED制御を行う事になったのですが、プログラム面で今行き詰っています. void PointDisplay(int* pointlist[8][8],int time)//指定した座標のLEDを点灯させる { PORTB=init_PORTB; PORTD=init_PORTD; for(int loop=0;loop<=time;loop++) { for(int k=0;k<=7;k++){ switch(k){ case 0: ROW1_on; break; case 1: ROW2_on; break; case 2: ROW3_on; break; case 3: ROW4_on; break; case 4: ROW5_on; break; case 5: ROW6_on; break; case 6: ROW7_on; break; case 7: ROW8_on; break; } for(int j=0;j<=7;j++){ if(pointlist[k][j]==1){ switch(j){ case 0: COL1_ready; break; case 1: COL2_ready; break; case 2: COL3_ready; break; case 3: COL4_ready; break; case 4: COL5_ready; break; case 5: COL6_ready; break; case 6: COL7_ready; break; case 7: COL8_ready; break; } } } PORTB=init_PORTB; PORTD=init_PORTD; } } } 以上が使用する関数で,実行内容としては2次配列pointlistを関数PointDisplayに渡し,time分だけループするという関数になります. マトリクスLEDは8×8のTOM-1588BHです.(データシートも添付しております 引用) 使用しているAVRはATmega168Pで,PORTD0~7をLEDの1~8pinにPORTB0~7をLEDの9~16pinに接続しています.(回路がわかりやすくなるように)そしてそれを#defineで定義しそれぞれをビット制御しています. 行き詰っている理由はintの配列を4つまで定義してコンパイル>実行すると思ったとおりにLEDに表示されるのですが,5つ以上定義してコンパイル>実行すると3,4つめの配列が乱れてしまいます.(ひとつ右にずれたりひとつ上にずれたり) 4つまでは正常に動作しているのでハード面は問題ないと考えて,ソフト面を見直しているのですが,なぜ悪いのかが理解できません.(オーバーフローとかそんなんですかね?) こういったマイコンを扱うプログラムは経験が少なく,データシートも英文なので困っています.どなたか詳しい方,知恵を貸していただけないでしょうか?お願い致します.

  • ポインタ(追加質問)

    http://okwave.jp/qa5092628.html の続きです。補足にいれようかとも思いましたが 以前より前の質問は占めたほうがいいと言われつづけてたので 閉めてしまいました。 #include <ctype.h> #include <string.h> #include <stdlib.h> #include <stdio.h> typedef struct{ int number; char *class_type; char *name; char *subject; } my; my *data; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i, non_value = 0; data = malloc(sizeof(my)*100); //最大100人分とる。それを越えたケースは今は考慮しない。ここを変更 if((fp=fopen("test.txt","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: data[line].number=atoi(bufG); //ここを変更 break; case 1: data[line].class_type = malloc(strlen(bufG)+1); //これを追加 strcpy(data[line].class_type, bufG); break; case 2: data[line].name = malloc(strlen(bufG)+1); //これを追加 strcpy(data[line].name, bufG); break; case 3: data[line].subject = malloc(strlen(bufG)+1); //これを追加 strcpy(data[line].subject, bufG); break; } field++; } else{ str++; non_value++; if(non_value == 2){ switch(field){ case 0: data[line].number=' '; //ここを変更 break; case 1: data[line].class_type = malloc(3); //これを追加 strcpy(data[line].class_type, " "); break; case 2: data[line].name = malloc(3); //これを追加 strcpy(data[line].name, " "); break; case 3: data[line].subject = malloc(3); //これを追加 strcpy(data[line].subject, " "); break; } non_value = 0; str++; field++; } } line++; field = 0; } //ここはおまけ for (i =0; i < line;i++){ printf("%d:%s:%s:%s\n", data[i].number,data[i].class_type,data[i].name,data[i].subject); } fclose(fp); return 0; } 前回載せてもらった解答ではcsvファイルに空欄があると 値が代入されなかったのでその機能をつけました。 具体的には,が連続してあると(csvファイルに空欄がある場合1,A,,数学のように,と,の間には何もない)場合半角スペースを入れてます。 この場合例えば1,A,,数学のように名前の欄を空白にするとdata[0].name は半角スペースが入ってますが その次の値、すなわちdata[0].subjectの値がばぐった値になっています。 改善方法を教えて下さい。 もう1点あります。上のソースでは data = malloc(sizeof(my)*100); //最大100人分とる。それを越えたケースは今は考慮しない。ここを変更 とありますがこれを while(fgets(buf,1000,fp) != NULL){ str = buf; data = malloc(sizeof(my)*100); ←このへんに  if(line > 100)){ //メモリ追加処理 } のようにすることは可能ですか?

  • C言語にて至急質問!!

    授業でゲーム作成してますがタイム表示とえさの残り数表示と残りのライフ表示 のプログラムがわかりません プログラムは下にあります #include<stdio.h> #include<stdlib.h> #include<time.h> #include"utility.h" int map[25][40]; typedef struct{ int x; int y; int life; int col; }CHAR; void disp(int,int); void main(void) { FILE *fp; CHAR man,mapsize,teki[5]; int i,j,cnt = 0,x,y,flg,wx,wy,stime = 0,etime = 0 ; GetConsoleHandle( ); srand(time(NULL)); fp = fopen("map.txt","r"); if(fp == NULL){ printf("ファイルエラー\n"); return; } fscanf(fp,"%d %d",&mapsize.y,&mapsize.x); fscanf(fp,"%d %d",&man.y,&man.x); wy = man.y; wx = man.x; fscanf(fp,"%d" "%d",&y,&x); for(i = 0;i < mapsize.y;i++) for(j = 0;j < mapsize.x;j++){ fscanf(fp,"%d",&map[i][j]); if(map[i][j] == 1) cnt++; } fclose(fp); disp(mapsize.x,mapsize.y); Locate(man.x * 2 +10,man.y + 3); printf("Э"); if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } man.life = 10; man.col = 0x0e; for(i = 0;i < 5;i++){ teki[i].y = y; teki[i].x = x; teki[i].life = 1; teki[i].col = rand() % 7 + 9; } while(cnt && man.life){ Wait(100); if(KeyCheck(ESCAPE)) break; Locate(man.x * 2 + 10,man.y + 3); SetColor2(0x00); printf(" "); if(KeyCheck (LEFT) && map[man.y][man.x - 1] != 9){ man.x--; } if(KeyCheck (RIGHT) && map[man.y][man.x + 1] != 9){ man.x++; } if(KeyCheck (UP) && map[man.y - 1][man.x] != 9){ man.y--; } if(KeyCheck (DOWN) && map[man.y + 1][man.x] != 9){ man.y++; } flg = -1; for(i = 0;i < 5;i++){ if(man.y == teki[i].y && man.x == teki[i].x) flg = i; } if(flg == -1){ if(map[man.y][man.x] > 9){ j = map[man.y][man.x]; man.x = j / 100; man.y = j % 100; } if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } else if(map[man.y][man.x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ stime = time(NULL); if(stime < etime){ teki[flg].life--; if(map[teki[flg].y][teki[flg].x] == 1){ map[teki[flg].y][teki[flg].x] = 0; cnt--; }else if(map[teki[flg].y][teki[flg].x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ man.life--; SetColor(0x0f); Locate(60,3); Locate(teki[flg].x * 2,teki[flg].y); SetColor2(teki[flg].col); printf("Ψ"); man.x = wx; man.y = wy; Wait(3000); Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); } } Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); for(i = 0;i < 5;i++){ if(teki[i].life == 1){ Locate(teki[i].x * 2 + 10,teki[i].y +3); switch(map[teki[i].y][teki[i].x]){ case 0:SetColor2(0x0f); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; } j = rand() % 4; if(j == 0 && map[teki[i].y - 1][teki[i].x] != 9){ teki[i].y--; } if(j == 1 && map[teki[i].y][teki[i].x + 1] != 9){ teki[i].x++; } if(j == 2 && map[teki[i].y + 1][teki[i].x] != 9){ teki[i].y++; } if(j == 3 && map[teki[i].y][teki[i].x - 1] != 9){ teki[i].x--; } Locate(teki[i].x * 2 + 10,teki[i].y + 3); stime = time(NULL); if(stime < etime) SetColor2(teki[i].col << 4); else SetColor2(teki[i].col); printf("Ψ"); }else{ stime = time(NULL); if(stime >= etime){ teki[i].life = 1; teki[i].y = y; teki[i].x = x; } } } } } void disp(int x,int y){ int i,j; for(i = 0;i < y;i++){ for(j = 0;j < x;j++){ Locate(j*2 + 10,i + 3); switch(map[i][j]){ case 0:SetColor2(0x00); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; case 9:SetColor2(0x99); printf("■"); break; default:SetColor2(0x0d); printf(" "); } } } } このどこかに質問したプログラムがはいるかもおしえてほしいです。 至急回答をどうかおねがいします

  • C++での乱射ショットについて教えてください。

    お疲れ様です。 今回もお世話になります。 シューティングゲームのサンプルで勉強しています。 サンプルの乱射ショットの実行画面では弾が20発くらい 一度に乱射した状態で発射します。 自分の実行画面は1~2発、画面から後退するときに もう1~2発発射するだけです。 自分なりにコードを足してみたりしたのですが 2くらい増えただけで乱射になりません。 まだ理解不足で出来ませんでした。 何が足りないか教えてください。 以下は乱射部分だけのコードです。 その下にENEMY::Shot()の全体のコードを載せます。 失礼します。 //乱射ショット case 3: //1ループ毎に1発発射 for(int i=0;i<ENEMY_SNUM;++i){ //フラグが立ってない弾を探して、座標セット if(shot[i].flag==false){ shot[i].flag=true; shot[i].x=x; shot[i].y=y; //初回だけ乱数初期化 if(num==0){ srand((unsigned int)time(NULL)); shot[i].rad=atan2(py-y,px-x)-(60*PI/180)+((rand()%120)*PI/180); ++num; break; } } } break; 以下はENEMY::Shot()の全体のコードです。 void ENEMY::Shot() { //CONTROLクラスの参照 CONTROL &control = CONTROL::GetInstance(); double px,py; //発射タイミングになったら、フラグを立てる if(shot_time==g_count){ sflag=true; } //フラグを立てるときだけ if(sflag){ //プレイヤーの一取得 control.GetPlayerPosition(&px,&py); //敵とプレイヤーとの座標の差から逆正接を求める。 //初回だけ実行 if(scount==0) rad=atan2(py-y,px-x); switch(s_pattern){ //前方にショット case 0: //5回に一回発射。20までなので5発発射。 if(scount%5==0 && scount<=20){ for(int i=0;i<ENEMY_SNUM;++i){ //フラグが立ってない弾を探して、座標をセット f(shot[i].flag==false){ shot[i].flag=true; shot[i].x=x; shot[i].y=y; shot[i].rad=rad; break; } } } break; //プレイヤーに向かって直線ショット case 1: //6ループに一回発射。54までなので10発発射。 if(scount%6==0 && scount<=54){ for(int i=0;i<ENEMY_SNUM;++i){ //フラグが立っていない弾を探して、座標をセット if(shot[i].flag==false){ shot[i].flag=true; shot[i].x=x; shot[i].y=y; shot[i].rad=rad; break; } } } break; //3直線ショット case 2: //10ループに一回発射。1ループに3発なので5ループさせると15発発射 if(scount%10==0 && scount<=40){ for(int i=0;i<ENEMY_SNUM;++i){ //フラグが立っていない弾を探して、座標等をセット if(shot[i].flag==false){ shot[i].flag=true; shot[i].x=x; shot[i].y=y; //0の時は左より if(num==0){ //敵とプレイヤーとの逆正接から10度引いたラジアンを代入 shot[i].rad=rad-(10*3.14/180); //1の時はプレイヤー一直線 }else if(num==1){ //敵とプレイヤーとの逆正接を代入 shot[i].rad=rad; //2の時は右より }else if(num==2){ //敵とプレイヤーとの逆正接から10度足したラジアンを代入 shot[i].rad=rad+(10*PI/180); } ++num; //3発発射したら,numを0にしてループを抜ける。 if(num==3){ num=0; break; } } } } break; //乱射ショット case 3: //1ループ毎に1発発射 for(int i=0;i<ENEMY_SNUM;++i){ //フラグが立ってない弾を探して、座標セット if(shot[i].flag==false){ shot[i].flag=true; shot[i].x=x; shot[i].y=y; //初回だけ乱数初期化 if(num==0){ srand((unsigned int)time(NULL)); shot[i].rad=atan2(py-y,px-x)-(60*PI/180)+((rand()%120)*PI/180); ++num; break; } } } break; } //フラグが立ってる弾の数 int s=0; //フラグが立ってる弾だけ、弾の移動を行う for(int i=0;i<ENEMY_SNUM;++i){ if(shot[i].flag){ switch(shot[i].pattern){ //単純に下に発射 case0: shot[i].y+=shot[i].speed; break; case 1: shot[i].x+=shot[i].speed*cos(shot[i].rad); shot[i].y+=shot[i].speed*sin(shot[i].rad); break; case 2: shot[i].x+=shot[i].speed*cos(shot[i].rad); shot[i].y+=shot[i].speed*sin(shot[i].rad); break; case 3: shot[i].x+=shot[i].speed*cos(shot[i].rad); shot[i].y+=shot[i].speed*sin(shot[i].rad); break; } //弾が画面をはみ出たらフラグを戻す。 if(ShotOutCheck(i)){ shot[i].flag=false; continue; } ++s; } } //sがゼロということは発射中の弾がない。 //かつdeadflagがTRUEということはこの敵のクラスは消滅させてよい if(s==0 && deadflag){ //敵クラス消滅フラグをTRUEにする endflag=true; } ++scount; } }

  • C++でcsvファイルから文字列を取得するのに

    C++でcsvファイルから文字列を取得するというものを作っているのですが、うまく取り出すことができません。ファイルはオープンできて、文字列にも分けられているのだとは思うのですが、どこのデータを表示させても"1aa"としか表示されません。なにも格納されていない所は"1aa"とは表示されず空白ですが。 以下に取り出す際使用しているコードを記載するので、うまい具合にいくアドバイスがありましたらお願いします。 ↓で格納させる場所を作っています。 typedef struct { char* Input; char* Output; char* AddName; char* Path; char* LED; int VS; char* Title; char* Copy; } csvdata_t; csvdata_t csvdata[100]として別の場所で宣言してます ↓この関数で格納させています void loadData(){     FILE *fp;    fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています    int n,num,i;        int input[1024]; char inputc[1024]; for(i = 0; i < 1; i++)//最初の1行読み飛ばす while(fgetc(fp) != '\n'); n = 0; num = 0; while(1){ for(i = 0;i < 64; i++){ inputc[i] = input[i];// = fgetc(fp);//1文字取得する input[i] = fgetc(fp); if(inputc[i] == '/'){//スラッシュがあれば while(fgetc(fp) != '\n');//改行までループ i = -1;//カウンタを最初に戻して continue; } if(input[i] == ',' || input[i] == '\n'){//カンマか改行なら inputc[i] = '\0';//そこまでを文字列とし break; } if(input[i] == EOF){//ファイルの終わりなら goto EXFILE;//終了 } } switch(num){ case 0: csvdata[n].Input = inputc;break; case 1: csvdata[n].Output = inputc;break; case 2: csvdata[n].AddName = inputc;break; case 3: csvdata[n].Path = inputc;break; case 4: csvdata[n].LED = inputc;break; case 5: csvdata[n].VS = atoi(inputc);break; case 6: csvdata[n].Title = inputc;break; case 7: csvdata[n].Copy = inputc;break; case 8: break; } num++; if(num == 9){//9まできたら num = 0;//0に戻す n++;//次の行へ } } EXFILE: fclose(fp); }

  • ポインタ(続)

    http://okwave.jp/qa5092628.html の続きです。 #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { int number[6]; char *class_type; char *name; char *subject; } my; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char *bufNum,*bufClass,*bufName,*bufSub; int i; if((fp=fopen("test.txt","r"))==NULL){ printf("ファイルが開けません"); } my *data; data = (my *)calloc(112, sizeof(my)); if(!data){ printf("memoryが足りません\n"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; bufNum = (char *)malloc(strlen(buf) + 1); bufClass = (char *)malloc(strlen(buf) +1); bufName= (char *)malloc(strlen(buf) + 1); bufSub = (char *)malloc(strlen(buf) +1); while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ switch(field){ case 0: *bufNum = *Str; data[line].number[line] = atoi(bufNum); break; case 1: *bufClass= *str; data[line].class_type = bufClass; break; case 2: *bufName = *str; data[line].name = bufName; break; case3: *bufSub = *str; data[line].subject = bufSub; break; } } str++; } switch(field){ case 0: bufNum[i] = '\0'; break; case 1: bufClass[i] = '\0'; break; case 2: bufName[i] = '\0';break; case 3: bufSub[i] = '\0'; break; } field++; } else{ str++; } } line++; field = 0; } printf("%s", data[0].name); fclose(fp); return 0; } と作ってみましたがまぁこれも上手く動かないんですが・・ 1、構造体をつくる 2、構造体のメモリをとる 3、ファイルをよみこむ 4、ポインタで宣言した構造体のメンバのメモリをとり実体をつくる 5、一行ずつよみこむ 6、カンマごとに格納 7、格納後終端文字を入れる 格納の区別はカンマごとにfieldを+しfieldの値にて行なう lineは行数 8,printfでテスト表示 終わり という一連のプログラムです。 class_typeまでは正常にでるんですが nameからが入っていません。 他にもここが微妙とかいうのがあったら教えて下さい。 個人的にはbufNum~bufSubのメモリの取り方が大きすぎる とは思うんですが他にいい手もなくて・・

  • C言語でtxtデータから日付の数値だけ読込たい

    sample02.txtファイルには「19日 18日 17日…22日」と一行に1日づつの日付データがはいっています。それをC言語で数値の部分だけ読込むつもりでプログラムを書いたのですが1行目の「19」はとれたところでダメになってしまいます。。。何がまずいのか教えていただけますでしょうか。 VisualStudio2019で学習しております。 ソースとデータを以下に添付いたします。 よろしくお願いいたします。 日付読込.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { FILE* const fp = fopen("sample02.txt", "r"); if (fp) { int d; int buf = 0; for (;;) { buf = fscanf(fp, "%d日", &d); if (buf > 0) printf("%d buf%d\n", d, buf); else { printf("buf%d", buf); break; } } } } sample02.txt 19日 18日 17日 16日 15日 12日 10日 9日 8日 5日 4日 3日 2日 1日 29日 28日 27日 26日 25日 22日