• 締切済み

mapの使い方教えてください

環境 Visual C++ 2008  Microsoft .NET Framework Version 3.5 まだC++をはじめたばかりでよくわかっていない初心者です。 <vector>を使ったソースは出来たのですが、<map>を使って書き直したいと思ってます。 ですがよく理解出来ずに悩んでます。 やりたいことは、 1:ファイルを読み込む 2:ファイルから必要なデータを取り出す 3:データを集計する 4:データを下のように出力する      6620f4ff   SB006  1件 読みにくいかもしれませんが、自分の書いたソースを載せておきます。 読み込むデータファイルの中身も下に載せておきます。 アドバイスをお願いします。 #include <vector> #include <fstream> #include <iostream> using namespace std; struct Record{ char mesh[10]; char err[6]; int num;  }; #define MESHKEYWORD "メッシュ" #define ERRKEYWORD "ERROR" int main() { ifstream fin(Data001.txt); if(!fin){ return 1; } char str[1024]; Record rec; vector<Record> ary; ary.clear() ; do { fin.getline(str,sizeof(str));    if(strncmp(&str[0], MESHKEYWORD,strlen(MESHKEYWORD)) == 0) { strncpy(rec.mesh,&str[10],8); rec.mesh[8] = '\0'; } if(strncmp(&str[0], ERRKEYWORD,strlen(ERRKEYWORD)) == 0) { strncpy(rec.err,&str[6],5); rec.err[5] = '\0'; bool searchresult = false; for(int i=0; i < ary.size(); i++){ if(strcmp(ary[i].mesh,rec.mesh) == 0){ if(strcmp(ary[i].err,rec.err) == 0){ ary[i].num++; searchresult = true; } } } if(searchresult == false){ rec.num = 1; ary.push_back(rec) ; } } }while(!fin.eof()); for(int i=0; i < ary.size(); i++){ cout << ary[i].mesh << '\t'; cout << ary[i].err << '\t'; cout << ary[i].num << "件\n"; } fin.close() ; ary.clear() ; return 0; } ちなみにデータファイルの中身はこんな感じです。 Data001.txt メッシュ[ 6620f4ff ]を読み込みます レベル:4 緯度方向:6144 経度方向:2560 ERROR:SB006 背景種別単位ヘッダのオフセットが不正です ERROR:KT005 データヘッダ1WのRESERVEDに設定されています ERROR:MNR08 道路図郭ノードから隣接図郭ノードへのリンク方向が異なります メッシュ[ 6622f4ff ]を読み込みます レベル:4 緯度方向:6144 経度方向:2816 メッシュ[ 5816f5ff ]を読み込みます レベル:5 緯度方向:5120 経度方向:2048 ERROR:KT005 データヘッダ1WのRESERVEDに設定されています ERROR:KT009 隣接ノード対応情報.自レベル情報.RESERVEDに設定されている ERROR:KT010 隣接ノード対応情報.下位レベル情報.下位レベルノード番ERROR:KT010 隣接ノード対応情報.下位レベル情報.下位レベルノード番

みんなの回答

回答No.1

下記参照

参考URL:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=20954

関連するQ&A

  • c++のプログラムについて

    c++の勉強をしているのですが、以下の例題のプログラムを記述するにあたって、適した記述がいまいち思いつきません。 例題) 以下のData001.txtファイルを読み込み、エラーを集計する。 a,bを半角英数1文字として、"[ aaaaaaaa ]"であらわすことができる行から、次の"[ aaaaaaaa ]"であらわすことができる行までの "ERROR:bbbbb"で始まる行を"bbbbb"毎に集計する。 結果を、"aaaaaaaa  bbbbb  件数"の形で ※列の区切り文字をタブ文字 ※行の区切り文字を改行文字 として 標準出力へ出力する。 Data001.txt メッシュ[ 5818f4ff ]を読み込みます レベル:4 緯度方向:5120 経度方向:2304 メッシュ[ 5820f4ff ]を読み込みます レベル:4 緯度方向:5120 経度方向:2560 メッシュ[ 5822f4ff ]を読み込みます レベル:4 緯度方向:5120 経度方向:2816 ERROR:KT003 データヘッダ0WのRESERVEDに設定されています ERROR:KT004 データヘッダ1WのRESERVEDに設定されています ERROR:KT005 データヘッダ1WのRESERVEDに設定されています ERROR:KT009 隣接ノード対応情報.自レベル情報.RESERVEDに設定されている                ・                ・ メッシュ[ 6018f4ff ]を読み込みます レベル:4 緯度方向:5376 経度方向:2304 ERROR:SB006 背景種別単位ヘッダのオフセットが不正です ERROR:KT003 データヘッダ0WのRESERVEDに設定されています ERROR:KT005 データヘッダ1WのRESERVEDに設定されています ERROR:MNR07 隣接接続図郭ノードに対応する隣接道路ノード・リンク情報が見つかりません メッシュ[ 6020f4ff ]を読み込みます レベル:4 緯度方向:5376 経度方向:2560 ・                ・               以下続く 以上です。 どうかよろしくお願いします。

  • C言語 自然数の四則演算 エラー原因不明

    プログラミング初心者です 自然数の四則演算のプログラムを作ったところ コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。 自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。 ご教授お願いします。 <環境> Windows 7 Home Premium 64-bit Visual Studio 2013 #include<stdio.h> #include<ctype.h> #include<stdlib.h> int main( void ) { char str[2][128]={{0}}; int i,j,err=0,cont=0,wari=0; double c,d,dans; long a,b,lans; puts("自然数の四則演算('+''-''*''/')を計算"); //被加数,被減数,被乗数,被除数と演算の判定 i=0; while((str[0][i]=getchar())!='\n'){ if(str[0][0]=='+' || str[0][0]=='*' || str[0][0]=='/' || str[0][0]=='-'){ err=1; } if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){ cont=1; //2つ目の数字を読み込むか否かの判定 break; }else if(isdigit(str[0][i])==0){ err=1; //数字と演算方法以外の入力はエラー } i++; } //加数,減数,乗数,除数の判定 if(cont==1 && err!=1){ j=0; while(str[1][j]!='\n'){ if(isdigit(str[0][i])==0){ err=1; //数字以外の入力があればエラー } j++; } str[1][j]='\0'; if(err==1){ printf("エラー入力"); return 0; } switch(str[0][i]){ case '+': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a+b; break; case '-': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a-b; break; case '*': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a*b; break; case '/': str[0][i]='\0'; c=atol(str[0]); d=atol(str[1]); dans=(double)c/d; wari=1; //割り算の判定 break; default: break; } } if(err==0){ if(wari==0){ printf("計算結果:%ld\n",lans); }else if(wari==1){ printf("計算結果:%f\n",dans); } }else{ printf("エラー入力です\n"); } return 0; }

  • エラーで式の開始が不正ですと出ます。

    質問内容 課題 ・ファイル student.txt に学生データ(学籍番号、氏名、所属学部)が入っている。 ・半角文字で学籍番号を入れて、検索ボタンを押すと、氏名と学部が表示される。 ・存在しない学籍番号を入れて、検索ボタンを押すと、「該当なし」が表示される。 ・ファイル student.txt の内容。  学籍番号 氏名 学部の間は半角スペースで区切る。 0521201 金城花子 文学部 0533101 守山春子 生活環境学部 0561101 大森夏子 人間科学部 0552130 名城秋子 現代文化学部 0571201 鶴舞冬子 薬学部 プログラムソース↓ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; class kadai2Frame extends JFrame { private JTextField tf1,tf2,tf3; public kadai2Frame() { setSize(200,100); addWindowListener(new WindowAdapter() { // ×クリック時の終了処理 public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c=getContentPane(); c.setLayout(new GridLayout(4,2)); // グリッドレイアウト4 行2 列を指定 c.add(new JLabel("学籍番号")); // 最初のラベルを作成して[名前]と表示 c.add(tf1=new JTextField("",8)); c.add(new JLabel("氏名")); // 最初のラベルを作成して[名前]と表示 c.add(tf2=new JTextField("",8)); c.add(new JLabel("学部")); // 次のラベルを作成して[年齢]と表示 c.add(tf3=new JTextField("",8)); JButton bt; c.add(bt=new JButton("検索")); // ボタンbt を作成して[検索]と表示 bt.addActionListener(new ActionListener() { // ボタンbt のリスナーを登録 public void actionPerformed(ActionEvent e) { // ボタンが押された時 string s6 = tf1.getText(); if(s1.equals(s6)){tf2.setText(str1Ary[1]); string s6 = tf1.getText(); if(s2.equals(s6)){tf2.setText(str2Ary[1]); string s6 = tf1.getText(); if(s3.equals(s6)){tf2.setText(str3Ary[1]); string s6 = tf1.getText(); if(s4.equals(s6)){tf2.setText(str4Ary[1]); string s6 = tf1.getText(); if(s5.equals(s6)){tf2.setText(str5Ary[1]); } public static void main(String[] args) { JFrame w=new kadai2Frame(); w.setVisible(true); try{ BufferedReader br = new BufferedReader(new FileReader("student.txt")); } catch (FileNotFoundException e) { String str1 = br.readLine(); String str2 = br.readLine(); String str3 = br.readLine(); String str4 = br.readLine(); String str5 = br.readLine(); String[] str1Ary = str1.split(" "); for (int i=0; i<str1Ary.length; i++) { System.out.println(str1Ary[i]); } String[] str2Ary = str2.split(" "); for (int i=0; i<str2Ary.length; i++) { System.out.println(str2Ary[i]); } String[] str3Ary = str3.split(" "); for (int i=0; i<str3Ary.length; i++) { System.out.println(str3Ary[i]); } String[] str4Ary = str4.split(" "); for (int i=0; i<str4Ary.length; i++) { System.out.println(str4Ary[i]); } String[] str5Ary = str5.split(" "); for (int i=0; i<str5Ary.length; i++) { System.out.println(str5Ary[i]); } String s1 = "str1Ary[0]"; String s6 = "tf1"; String s2 = "str2Ary[0]"; String s3 = "str3Ary[0]"; String s4 = "str4Ary[0]"; String s5 = "str5Ary[0]"; } } }); } } 以上です。誰か教えてください!!(ToT)

    • ベストアンサー
    • Java
  • 0バイトのファイルを検知したい。

    ファイル上のデータを読み出して、メモリ上に一時保管する過程で、読み出しファイルのデータが0バイトであった時にエラーメッセージを表示させたいのですが、何で検知できるのでしょうか。C言語でつくっています。 ちなみに今はこんな感じになっているんですが・・・・・・ /** データを入力 **/ if(fgets(buf,sizeof(buf), fin) == NULL){    /** 売上表ファイル入力 **/    if(ferror(fin) != 0){ /** エラー時 **/       printf(ERR_MSG,SORT,URI_FIL,uriage_file);    }else{       i_ret = 0; /** 読み込み終了時 **/    }

  • ファイル入出力で

    現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #include <stdio.h> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。

  • 16進数の数値を変数に代入したい

    いつもお世話になっております。 文字コードを復号して文字列を出力したいのですが 以下のdecode_charクラスのコードの13行目でエラーになります。 解決方法ご存知でしたら、ご回答いただけないでしょうか よろしくお願いします。 例)文字列"82a0"を入力値する。 0x82を16進数の数値として変換したいが NumberFormatExceptionが発生。 ------------------------------------------------ class decode_char { public static void main(String arg[]) { String str_code = arg[0]; //入力値 String divice_code = ""; //入力値の2桁ずつの文字コード byte code_ary[] = null; //divice_codeの16進数整数 String maked_char = ""; //Shift_JISで復号した文字列 for(int i = 0 ; i < str_code.length() / 2 ; i++) { divice_code = str_code.substring(i * 2,i * 2 + 2); code_ary[i] = Integer.parseInt("0x" + divice_code); } try { maked_char = new String(code_ary,"Shift_JIS"); System.out.println(maked_char); } catch(Exception e) { System.err.println("error!"); } } }

    • ベストアンサー
    • Java
  • C++でファイルから複数行のデータを入力する方法

    C++でファイル操作をプログラミングしています。 入力として使いたいファイルは以下のように記述されています。 1 2 3 2 2 2 54 57 65 のように数字の間にはスペースが入ってます。また3つ目の数字の後には 改行が入っています。 このようなデータを取り込むときはどのように記述すればいいのでしょうか? 今作ってみたコードは以下のようなんですけど、うまく格納されていません。 よろしくお願いします。 ifstream fin("ファイル名"); vector<int> x,y,z; while (!fin.eof()){ if (!(fin >> i)) break; x.push_back(i); if (!(fin >> i)) break; y.push_back(i); if (!(fin >> i)) break; z.push_back(i); }

  • C言語

    3. 整数配列data の,data[left]からdata[right-1]の最小値がある添字番号を返す関数 int min_ind_ary(const int data[ ], int left, int right) で最小値が複数あるときは,一番小さい添字を返すようにするにはどうしたらよいのかわかりません? 途中経過↓ #include <stdio.h> int min_ind_ary(const int data[10],int left,int right) { int i,min = 0; for( i = 1; i < left; i++){ if(data[min] < data[i]) min = i; } return min; } void print_ary(const int data[10], int size){ int i; for(i = 0; i < 10; i++){ printf("%2d", data[i]); } } void sort_ary (int data[10], int size) { int i; for(i = 0; i < size - 1; i ++ ) { int min, work; min = min_ind_ary(data, i, size); work = data[min]; data[min] = data[i]; data[i] = work; } return; } int main(void) { int data[10] = {1, 6, 4, 8, 2, 3, 5, 9, 7, 4}; print_ary(data, 10); sort_ary(data, 10); print_ary(data, 10); return 0; }

  • ajaxでPHPにPOST送信して結果データを受信しようとしていますがうまくいきません。

    セレクトボックスの値を受け取りPOST送信 <HTML側> function SelValue(){ var x = $('#category1').val(); $.ajax({ type: "POST", url: "category.php", data: {"prm":x}, dataType: "json", success: function(data, status){ alert(data.address1 + data.address2); }, error: function(XMLHttpRequest, status, errorThrown){ alert("エラーが発生しました!"); } }); } 以下category.php if(!$_POST) header("Location: input.php"); $CATEGORY2 = array( 1 =>array( 1 => "a", 2 => "b", 3 => "c", ), 2 => array( 1 => "d", 2 => "e", 3 => "f", ), 3 => array( 1 => "g", 2 => "h", 3 => "i", ), ); $ary = array(); if($_POST["prm"]){ for($i=1;$i<=3;$i++){ foreach($CATEGORY2[$i] as $key => $value){ if($key == $_POST["prm"]) $ary = $CATEGORY2[$i]; } } } json_encode($ary); としています。 PHPにPOSTしたデータも確認できないし jsonデータを表示できないです。 どのようにしたらいいかわかりません。 ajax初心者でわからないことだらけです。 教えてください。

    • ベストアンサー
    • AJAX
  • 2分木のノードの指定方法を変えたい

    下のプログラムはコマンドライン引数できまった形で入力した数を2分木にしてそれを表示させるc言語のプログラムです。 きまった形というのは 短縮形は [ 8 [ 7 2 5 ] [ 3 1 _ ] ] 短縮形でないのは [ 8 [ 7 [ 2 _ _ ] [ 5 _ _ ] ] [ 3 [ 1 _ _ ] _ ] ] ] のような形で、実行結果はそれぞれ a.exe [ 8 [ 7 2 5 ] [ 3 1 _ ] ] 入力データ [ 8 [ 7 2 5 ] [ 3 1 _ ] ] a.exe [ 8 [ 7 [ 2 _ _ ] [ 5 _ _ ] ] [ 3 [ 1 _ _ ] _ ] ] ] 入力データ [ 8 [ 7 2 5 ] [ 3 1 _ ] ] のようになります。 これをこのような形ではなくコマンドラインで 8 7 3 2 5 1 と入力するだけで2分木になるように 下のプログラムを変えたいのです。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int BITREE_TYPE; /* 格納データの型 */ struct node { BITREE_TYPE value; /* ノードの値 */ struct node *left; /* 左ノードのアドレス */ struct node *right; /* 右ノードのアドレス */ }; typedef struct node BITREE_NODE; void error(char *msg); BITREE_NODE *createNode(BITREE_TYPE x); void destroyBITree(BITREE_NODE *p); int isLeafNode(BITREE_NODE *p); void printBITree(BITREE_NODE *p, int tabs, int brief); BITREE_NODE *inputBITree(char *str[], int len, int *end); int gShortFormat = 1; /*1ならば短縮形で出力する*/ void error(char *msg){ fflush(stdout); fprintf(stderr,"%s\n", msg); exit(1); } BITREE_NODE *createNode(BITREE_TYPE x){ BITREE_NODE *new; new = malloc(sizeof(struct node)); if(new == NULL) error("createNode: メモリがありません"); new->value = x; new->left = NULL; new->right = NULL; return new; } void destroyBITree(BITREE_NODE *p){ if(p == NULL) return; destroyBITree(p->left); destroyBITree(p->right); memset(p, 0, sizeof(struct node)); free(p); } int isLeafNode(BITREE_NODE *p){ return(p->left == NULL) && (p->right == NULL); } void printSubtree(BITREE_NODE *p){ if(p == NULL){ printf("_"); return; } if(gShortFormat != 0 && isLeafNode(p)){ printf("%d", p->value); } else{ printf("[ "); printf("%d ", p->value); printSubtree(p->left); printf(" "); printSubtree(p->right); printf(" ]"); } } void printBITree(BITREE_NODE *p, int tabs, int brief){ int i; gShortFormat = brief; for (i = 0; i<tabs; i++) printf("\t"); printSubtree(p); printf("\n");fflush(stdout); } BITREE_NODE *inputBITree(char *str[], int len, int *end){ BITREE_NODE *p; int i =0; if(len < 1) error("inputBITree:データがありません"); /*短縮形の処理*/ if(strcmp(str[0], "[") != 0){ if(strcmp(str[0], "_") == 0) error("inputBTITree:値に_は指定できません"); *end =1; return createNode(atoi(str[0])); } p = createNode(atoi(str[1])); i = 2; if(strcmp(str[i], "_") != 0){ p->left = inputBITree(&str[i], len -i, end); i+= *end; } else{ i++; } if(strcmp(str[i], "_") != 0){ p->right = inputBITree(&str[i], len -i, end); i+= *end; } else{ i++; } if(strcmp(str[i], "]") != 0) error("inputBITree: 入力データが]で終わっていません"); *end = i + 1; return p; } int main(int argc, char *argv[]){ BITREE_NODE *p; int end = 0; p = inputBITree(argv+1, argc-1, &end); printf("入力データ "); printBITree(p,0,1); destroyBITree(p); return 0; }