C++ vector ファイル保存???

[戻る]
anri 2006/07/27(木) 13:36:46
またまたおねがいします。

C++ .NET 2003 MFC

void CoekakiView::OnDestroy()//終了時書き込み
{
    CView::OnDestroy();

    // TODO : ここにメッセージ ハンドラ コードを追加します。
    CStdioFile fin;

if(!fin.Open("Line.txt",CFile::modeCreate | CFile::modeWrite | 
CFile::typeBinary)){
                AfxMessageBox("読込みファイを開けません");
                return;
            }

            fin.Write(Ve_myPic,sizeof(Ve_myPic));

            fin.Close();
        }
    }
}

anri 2006/07/27(木) 13:41:36
またまたまちがえました。

vector<Picture> Ve_myPic;

void CoekakiView::OnDestroy()//終了時書き込み
{
  CView::OnDestroy();

    // TODO : ここにメッセージ ハンドラ コードを追加します。
  CStdioFile fin;
    
  if(!fin.Open("Line.txt",CFile::modeCreate | CFile::modeWrite | 
CFile::typeBinary)){
    AfxMessageBox("読込みファイを開けません");
    return;
  }
   
  fin.Write(Ve_myPic,sizeof(Ve_myPic));
  fin.Close();


}

というような感じなんですが じっこうすると

引数を'std::vecotor<_Ty>'から'const void *'に変換できません

ってでるんですが・・・

どうしたらよいでしょうか?

επιστημη 2006/07/27(木) 13:43:21
>  fin.Write(Ve_myPic,sizeof(Ve_myPic));

できませんこんなこと。

anri 2006/07/27(木) 13:44:53
では
vector で宣言したものを保存するにはどうしたらよいですか?

επιστημη 2006/07/27(木) 13:46:10
…てゆっかデタラメぢゃん。

CStdioFile fin;
fin.Open("Line.txt",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)

ファイル名が"Line.txt"でありながらバイナリ・オープンで、しかもCStdioFile?

επιστημη 2006/07/27(木) 13:47:55
> vector で宣言したものを保存するにはどうしたらよいですか?

ならば逆に質問。 
Picture data[N] をファイルに保存/復元するにはどうしますか?

anri 2006/07/27(木) 13:54:12
////・・・でたらめなのはごめんなさい

本をみながらサンプルプログラムをつぎはぎしながらやってるんで・・・orz
初心者なんで・・・ゆるしてください(T_T)

>ファイル名が"Line.txt"でありながらバイナリ・オープンで、しかもCStdioFile?

ってかんじからすると・・・

>Picture data[N] をファイルに保存/復元するにはどうしますか?

は Picure・オープンで開いてかきこみ・・・

正解?不正解?

PATIO 2006/07/27(木) 14:06:41
えーと、もしかして基本的な言語知識もなしに
むやみやたらとプログラミングしようとしていませんか?

せめて、fin.Write(Ve_myPic,sizeof(Ve_myPic));が不味いと言うことがわかる程度の
知識はないと難しいと思いますけれど。

C++言語の知識がないのであれば、ちゃんと言語知識の勉強をしましょう。
あと、C++言語の知識がないのであれば、MFCを使うのはまだ早いです。
MFCを使わずにコンソールアプリで純粋にC++言語の勉強をする事を
お勧めします。
VC++の勉強をするのはその後で良いと思いますよ。
教科書はC++言語の教科書を使う事が大事です。
いきなりVC++の教科書を使っても多分理解できません。

PATIO 2006/07/27(木) 14:09:05
あと、サンプルプログラムをつぎはぎしながら作るのは止めませんが、
使っているサンプルの中身を理解していないのであれば、
全く意味が無いので止めた方が良いです。
サンプルプログラムを参考にしてプログラムすると言うのは
内容を理解して自分のプリグラムに取り込むということであって
継ぎ接ぎで作ると言う事ではありません。
勉強にもならないし、へんな覚え方をすると逆に後々苦労します。
順を追って勉強する事をお勧めします。

PATIO 2006/07/27(木) 14:10:09
がーっ、誤字。

誤)
> 内容を理解して自分のプリグラムに取り込むということであって

正)
内容を理解して自分のプログラムに取り込むということであって

επιστημη 2006/07/27(木) 14:10:51
>>Picture data[N] をファイルに保存/復元するにはどうしますか?
> は Picure・オープンで開いてかきこみ・・・
> 正解?不正解?

は? Pictureはアナタが定義した構造体ちゃうのん?
# それともどこぞの馬の骨が作ったもの?
少なくとも僕が作ったものじゃないから僕は読み書きできません。

Picutureをファイルに読み書きできなきゃPictureの集合体である
vector<Picture>を読み書きできるわけないやん。

なので、
「vector<Picture>を読み書きするため、Pictureの読み方/書き方を教えてくれ」
と訊いておるのですが。

anri 2006/07/27(木) 14:13:17
すみません まったくそのとおりだとおもいますが・・・
今は時間がなく・・・課題はおわらせなければなりません

知識はC言語しかありません。

できれば やり方をおしえてください

anri 2006/07/27(木) 14:21:01
////ごめんなさい・・・

え〜と

typedef struct Picture{        //(保存する)
    int lFigure;        //線か図形を判断する 0:線 1〜:図形
    int nPoints;        //各線の点の数
    vector<POINT> ptLines;    //
                //線:各点の座標データ 図:配列番号[0]
    int lKinds;        //ペンの種類を保存する
    int pTns;            //ペンの太さを保存
    COLORREF pColors;        //ペンの色を保存    
}Picture;


Picture のなかみはこんなかんじです。

vector にするまえは

struct Picture myPic[1000];

fin.Write(myPic,sizeof(myPic));

だったのでうまくいっていました。

επιστημη 2006/07/27(木) 14:22:29
> 今は時間がなく・・・課題はおわらせなければなりません

それはアナタの都合。知ったことか。

> 知識はC言語しかありません。
> できれば やり方をおしえてください

だからぁ、教えてやるから Picture をファイルに書く/読む コードを提示してください。 Cで
いいから。
それがあれば vector<Picture> を読み書きできるから。

PATIO 2006/07/27(木) 14:26:11
学校の課題なら今の知識で無理やり課題を終わらせても無意味だと思うし、
何よりC言語の知識しかないのにC++言語でやろうというのが・・・。

会社の課題だったとしても理解しないで課題だけ出しても無意味ですしね。

と言うわけで私は降ります。(と言うほどアドバイスはしていませんけれど)

本来ならわからない事を先生とか課題を出している人に言って
ちゃんと勉強しなおすべきだと思いますよ。
今のままで突っ走っても良い事ありません。

Blue 2006/07/27(木) 14:26:17
vector を含む構造体は、もう固定長配列をつかっていたころの構造体とはまったく
違うものになります。(PODな構造体でなくなる)

よって、何も考えず、Writeメソッドで書き出すことは不可能です。
Writeメソッドで書き出すことを前提にしているのであれば、vector を使用するのはあ
きらめましょう。
(http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03015.htmlのようなつくりにすると
か。C++限らず、C言語でもよくやるとおもうけど。)

επιστημη 2006/07/27(木) 14:29:14
ようやっと内実を晒してくれたね。

typedef struct Picture{        //(保存する)
    int lFigure;        //線か図形を判断する 0:線 1〜:図形
    int nPoints;        //各線の点の数
    vector<POINT> ptLines;    //
                //線:各点の座標データ 図:配列番号[0]
    int lKinds;        //ペンの種類を保存する
    int pTns;            //ペンの太さを保存
    COLORREF pColors;        //ペンの色を保存    
}Picture;

ならば POINT をファイルに読み書きするコードを提示してください。
それがあれば Picture が読み書きできて、さらに vector<Picuture> が読み書きできます。

anri 2006/07/27(木) 14:31:37
・・・え〜と
コード ってなんですか?

επιστημη 2006/07/27(木) 14:33:30
ソースコード。

anri 2006/07/27(木) 14:33:58
コード プログラム記述文?

最初にのせたのやつではだめですか?

επιστημη 2006/07/27(木) 14:38:20
だからー

ならば POINT をファイルに読み書きするコードを提示してください。
それがあれば Picture が読み書きできて、さらに vector<Picuture> が読み書きできます。

だってば。

anri 2006/07/27(木) 14:39:54
すみません 書き込みについていけてませんでした。

えーと
vector にするまえのコード

typedef struct Picture{        //(保存する)
    int lFigure;            //線か図形を判断する 0:線 1〜:図形
    int nPoints;            //各線の点の数
    POINT ptLines[1000];    //1つの線を1000点で表す
    int lKinds;                //ペンの種類を保存する
    int pTns;                //ペンの太さを保存
    COLORREF pColors;        //ペンの色を保存    
}Picture;

struct Picture mypic[1000];

void CoekakiView::OnDestroy()//終了時書き込み
{
    CView::OnDestroy();

    // TODO : ここにメッセージ ハンドラ コードを追加します。
    CStdioFile fin;
    if(nLines != 0){
        if(AfxMessageBox("現在の線を保存して終了しますか?",MB_YESNO) 
== IDYES ){
            if(!fin.Open("Line.txt",CFile::modeCreate | 
CFile::modeWrite | CFile::typeBinary)){
                AfxMessageBox("読込みファイを開けません");
                return;
            }
            fin.Write(&nLines,sizeof(nLines));
            fin.Write(myPic,sizeof(myPic));

            fin.Close();
        }
    }
}

επιστημη 2006/07/27(木) 14:42:28
…通じてねぇ orz

ならば POINT をファイルに読み書きするコードを提示してください。
それがあれば Picture が読み書きできて、さらに vector<Picuture> が読み書きできます。

だっちゅーに。

anri 2006/07/27(木) 14:44:37
え
POINT って座標データの型じゃないんですか?

POINT p;

p.x = 3;
p.y = 2;

ってなかんじでつかってたんですけど・・・

かか 2006/07/27(木) 14:47:38
vector使うのを諦めた方がいいんでない?
C++がわかってないのにvector使う時点で無謀と言うか。

クラスとかの概念が無いから説明のしようがない気がする。

かか 2006/07/27(木) 14:50:37
じゃなくて

POINTの配列を書き込むときに1000点全部使っているわけじゃないでしょ。
2点しか使っていなくても1000点分書き込むの?
それってかなりの無駄じゃない?

普通なら使っている点数分だけ書き込むでしょ。
そうするにはどんなコードを書くのって言う事。

anri 2006/07/27(木) 14:52:05
たしかに・・・でも一度つくりはじめたので最後までやります。

本にのってました!!
Point構造体のメンバ
X  -x座標
Y  -y座標

かか 2006/07/27(木) 14:52:32
vectorを書き込む為の方法論に近い事やってるよって
επιστημηさんは言ってるんだけどなぁ。

クラスの概念を知らないとやっぱクラスを使っちゃ駄目だわ。

επιστημη 2006/07/27(木) 14:54:12
> POINT って座標データの型じゃないんですか?

知らん(たぶんそうでしょう)。 いずれにせよ:

  POINT をファイルに読み書きするコードを提示してください。
  それがあれば Picture が読み書きできて、さらに vector<Picuture> が読み書きできま
す。

と問うております。

anri 2006/07/27(木) 14:54:43
たぶん1000点使ってなくてもすべて書き込んでたと思います。


void CoekakiView::OnMouseMove(UINT nFlags, CPoint point)
{
pDC->MoveTo(oldPos);
pDC->LineTo(point);
myPic[nLines].ptLines[myPic[nLines].nPoints] = point;
myPic[nLines].nPoints++;
        
oldPos = point;

}

かか 2006/07/27(木) 15:07:54
なら、必要な分だけ書き込むコードを考えてみてはどうです?
そんなに難しいコードではないと思いますけれど。

επιστημη 2006/07/27(木) 15:10:23
> たぶん1000点使ってなくてもすべて書き込んでたと思います。

"と思います"ってナニよ。自分で書いたんでしょ?

かか 2006/07/27(木) 15:12:06
ちなみにコードを書いてごらんって言っているのはファイルに書き出す所ね。

επιστημη 2006/07/27(木) 15:22:42
脱力するなー… ファイルに書く話してんのに画面に描くコード持ち出すんだもんなー。

anri 2006/07/27(木) 16:12:46
すみません
>2点しか使っていなくても1000点分書き込むの?

ってことだったんで
線の点の座標をどうほぞんしてるかを見てもらおうとおもうって・・・

課題ですが・・・先生登場!!!!

なんとなくですがわかったきがします。

そしてこうなりました。

//    1つの図形のデータ
typedef struct Picture{        //(保存する)
    int lFigure;            //線か図形を判断する 0:線 1〜:図形
    int nPoints;            //各線の点の数
    vector<POINT> ptLines;    //1つの線を1000点で表す
                            //線:各点の座
標データ 図:配列番号[0]-中心座標? 配列番号[1]-図形の縦と横の長さ
    int lKinds;                //ペンの種類を保存する
    int pTns;                //ペンの太さを保存
    COLORREF pColors;        //ペンの色を保存    

    //    指定されたファイルへ自分の中身を書き込む
    void Write(CStdioFile* pFile) {
        //todo>書き込み処理記述

        pFile->Write(&lFigure, sizeof(lFigure));
        pFile->Write(&nPoints, sizeof(nPoints));
        pFile->Write(&ptLines[0], ptLines.size() * sizeof(POINT));
        pFile->Write(&lKinds, sizeof(lKinds));
        pFile->Write(&pColors, sizeof(pColors));    
    }
    //    指定されたファイルから自分の中身を読み込む
    void Read(CStdioFile* pFile) {
        //todo>書き込み処理記述

        pFile->Read(&lFigure, sizeof(lFigure));
        pFile->Read(&nPoints, sizeof(nPoints));
        ptLines.resize(nPoints);
        pFile->Read(&ptLines[0], ptLines.size() * sizeof(POINT));
        pFile->Read(&lKinds, sizeof(lKinds));
        pFile->Read(&pColors, sizeof(pColors));    
    }

    Picture() {}
    Picture(const Picture& c) {
        lFigure = c.lFigure;
        nPoints = c.nPoints;
        ptLines = c.ptLines;
        lKinds = c.lKinds;
        pTns = c.pTns;
        pColors = c.pColors;
    }
    Picture& operator=(const Picture& c) {
        lFigure = c.lFigure;
        nPoints = c.nPoints;
        ptLines = c.ptLines;
        lKinds = c.lKinds;
        pTns = c.pTns;
        pColors = c.pColors;
        return *this;
    }
}Picture;

vector<Picture> Ve_myPic;    //vector型(可変長)の配列を宣言
struct Picture myPic;


void CoekakiView::OnDestroy()//終了時書き込み
{
    CView::OnDestroy();

    // TODO : ここにメッセージ ハンドラ コードを追加します。
    CStdioFile fin;
    int i;

    if(nLines != 0){
        if(AfxMessageBox("現在の線を保存して終了しますか?",MB_YESNO) 
== IDYES ){
            if(!fin.Open("Line.DAT",CFile::modeCreate | 
CFile::modeWrite | CFile::typeBinary)){
                AfxMessageBox("読込みファイを開けません");
                return;
            }
            fin.Write(&nLines,sizeof(nLines));
            for( i = 0; i < nLines; i++){
                Ve_myPic[i].Write(&fin);
            }

            fin.Close();
        }
    }
}

みなさん ありがとうございました。
まだバグがありますが がんばります。

本当にすみませんでした。
ありがとうございました。

anri 2006/07/27(木) 16:15:24
[[解決]]
あ 解決済みまたわすれた・・・wwww

ありがとうございました。

επιστημη 2006/07/27(木) 16:28:09
えーと、そいつは理解した/納得したコードなのね?
"言われたとおりに書いたらできた"じゃありませんよね?
# それでもいっか、課題の提出が目的なら。

vectorをlistに差し替えただけでぶっ飛ぶコードですけどね。

PATIO 2006/07/27(木) 16:33:51
解決したようで何よりです。
επιστημηさんが書かれているように理解している事が大切ですよ。
理解していないコードは役に立ちません。

課題は何とか乗り越えられてもC++言語の基礎から勉強しなおすと言うのは
ちゃんと考えた方がいいです。
その後のやり取りを見てもかなり怪しい受け答えが多かったので。
というか、C言語も完全に理解できているのか心配な感じです。

あと、蛇足ですが、
wwwwはあんまり気持ちよくないので止めた方がいいです。
人によっては馬鹿にされたようにとられる事もありますから。

anri 2006/07/27(木) 17:00:14
ありがとうございます。
確かにそおかもしれません。

基礎からやりなおします。

ありがとうございました。

古いスレッドには追加発言できません。