ダイアログ画面からの入力によるCSVファイルのレコードの追加 – プログラミング – Home

ダイアログ画面からの入力によるCSVフ...
 
通知
すべてクリア

[解決済] ダイアログ画面からの入力によるCSVファイルのレコードの追加

固定ページ 1 / 3

さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

#include stdafx.h
#include File.h

#include FileDoc.h
#include FileView.h

#include <iostream>
#include <fstream>

using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFileView

CString name;
CString number;
CString Data_Write[255][255] = {{endrecord, endrecord}};
CString Data_Read[255][255];

class SampleDataWrite aa[255];
SampleDataWrite *sa;

class SampleDataRead ab[255];
SampleDataRead *sb;

IMPLEMENT_DYNCREATE(CFileView, CFormView)

BEGIN_MESSAGE_MAP(CFileView, CFormView)
//{{AFX_MSG_MAP(CFileView)
ON_EN_UPDATE(IDC_LIST2, List2draw)
ON_BN_CLICKED(IDC_BUTTON9, OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON10, OnBnClickedButton10)
//}}AFX_MSG_MAP
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFileView クラスの構築/消滅

CFileView::CFileView()
: CFormView(CFileView::IDD)
{
//{{AFX_DATA_INIT(CFileView)
//}}AFX_DATA_INIT
// TODO: この場所に構築用のコードを追加してください。

}

CFileView::~CFileView()
{
}

void CFileView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileView)
DDX_Control(pDX, IDC_LIST2, m_list2);
//}}AFX_DATA_MAP
}

BOOL CFileView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。

return CFormView::PreCreateWindow(cs);
}

void CFileView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

//■Data_Write配列のデータをSampleDataWriteクラスにコピーする
sa = aa;
for (int i=0; i<=15; i++) {
(sa+i)->setsportswrite(Data_Write[i][0]);
(sa+i)->setartwrite(Data_Write[i][1]);
}
}
/////////////////////////////////////////////////////////////////////////////
// CFileView クラスの印刷

BOOL CFileView::OnPreparePrinting(CPrintInfo* pInfo)
{
// デフォルトの印刷準備
return DoPreparePrinting(pInfo);
}

void CFileView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷前の特別な初期化処理を追加してください。
}

void CFileView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷後の後処理を追加してください。
}

void CFileView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷用のコードをここに追加してください。
}


引用未解決
トピックタグ
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

/////////////////////////////////////////////////////////////////////////////
// CFileView クラスの診断

#ifdef _DEBUG
void CFileView::AssertValid() const
{
CFormView::AssertValid();
}

void CFileView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}

CFileDoc* CFileView::GetDocument() // 非デバッグ バージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileDoc)));
return (CFileDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFileView クラスのメッセージ ハンドラ

void CFileView::List2draw(void)
{
// TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
// 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK
// メッセージをコントロールへ送るために CFormView::OnInitDialog() 関数をオーバー
// ライドしない限りこの通知を送りません。
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
char mych1[30];
m_list2.DeleteAllItems();
m_list2.DeleteColumn(0); m_list2.DeleteColumn(0); m_list2.DeleteColumn(0);
m_list2.DeleteColumn(0);
LVCOLUMN myColumn; myColumn.mask = LVCF_TEXT|LVCF_WIDTH;
RECT myRect; m_list2.GetClientRect(&myRect);
myColumn.cx = 120; myColumn.pszText = 社員No.; m_list2.InsertColumn
(0,&myColumn);
myColumn.cx = 120; myColumn.pszText = 社員名.; m_list2.InsertColumn
(1,&myColumn);

static LVITEM myITEM;
sb = ab;
for (int i=0; i<=15; i++) {
myITEM.mask =LVIF_TEXT; myITEM.iItem = i; myITEM.iSubItem = 0;
strcpy( mych1, (const char *)Data_Read[i][0] );
myITEM.pszText = mych1; m_list2.InsertItem(&myITEM);
myITEM.mask =LVIF_TEXT; myITEM.iItem = i; myITEM.iSubItem = 1;
strcpy( mych1, (const char *)Data_Read[i][1] );
myITEM.pszText = mych1; m_list2.SetItem(&myITEM);

}
long state; state = ::GetWindowLong(m_list2.GetSafeHwnd(),GWL_STYLE);
::SetWindowLong(m_list2.GetSafeHwnd(),GWL_STYLE,(state & ~LVS_TYPEMASK)
|LVS_REPORT);
}

void CFileView::OnBnClickedButton9()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
// TODO : ここにコントロール通知ハンドラ コードを追加します。
//■CSV出力 fopenの中のwをaに変えればAdd。追加します。 テキストエディタで入力と
リンクさせればAddできるかも
CString ss1;
char mych[30];
FILE *fp;
if((fp = fopen(.\\data\\export.csv,a)) == NULL){
AfxMessageBox( CSVファイルが開けません  ,MB_OK | MB_ICONEXCLAMATION);
}
for (int i=0; i<=3; i++) {
ss1 = Data_Write[i][0]+,+Data_Write[i][1]+\n;
strcpy( mych, (const char *)ss1 );
fprintf(fp,mych);
}
fclose(fp);
}

void CFileView::OnBnClickedButton10()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
// TODO : ここにコントロール通知ハンドラ コードを追加します。
//■CSV入力
int fa, fb, fc;
CString ss1;
char mych[30];
FILE *fp;
if((fp = fopen(.\\data\\export.csv,r)) == NULL){
AfxMessageBox( CSVファイルが開けません  ,MB_OK | MB_ICONEXCLAMATION);
return;
}
fc = 0;
while(1) {
//■行単位でデータを読み込み
fscanf(fp,%s,mych);
//■読み込んだ行単位のデータをカンマで分解
ss1 = mych;
fa = ss1.Find(',');
fb = ss1.GetLength();
Data_Read[fc][0] = ss1.Left(fa);
Data_Read[fc][1] = ss1.Right(fb-fa-1);
if(Data_Read[fc][0] == endrecord) {break; }
fc++;
}
fclose(fp);
List2draw();
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

…なにこれ?


返信引用
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

長文ですみません。

今現在CSVファイルの読み込みとリストビューへの表示ができるといった状況です。
これに「レコードの追加」を加えたいのですが、自分にはできません。
ダイアログ画面から入力してそれをCSVファイルの中のレコードとして追加したいのです
が、どうしたらいいでしょうか?
我侭なこと言うようですが、もしよろしければサンプルやヒントという形でお教え願えま
せんか?なんとしても自分の身につけたいので・・・

ホント我侭ですみません。
宜しくお願い致します。m(_ _)m


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

で、インデントも付けずにべたーっと貼ったコードにどんな意味があるのでしょうか?
こんなもん、だれも読んでくれませんよ。
Document/View-アーキテクチャも無視してるみたいだし。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> ダイアログ画面から入力してそれをCSVファイルの中のレコードとして追加したいのです
が、どうしたらいいでしょうか?

1. CSVファイルを追加書き込みモードでオープンする
2. ダイアログから得られた入力をカンマで繋いで[1]に書き込む
3. [1]を閉じる。

おしまい。


返信引用
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

先にインデントについて、失礼しました。以後気をつけます。

御返答有難う御座います。
ニュアンスは掴めたと思います。


返信引用
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

うまくいきませんorz

void CFileView::OnButton1()
{
CString ss;
CString ss1
CEdit* myED1 = (CEdit*) GetDlgItem(IDC_EDIT1);
myED1 -> GetWindowText (ss1); //ED1の文字列を取り出す

CString Data_Write[255][255] = {ss1};

char mych[30];
FILE *fp;
if((fp = fopen(.\\data\\export.csv,a)) == NULL){
AfxMessageBox( CSVファイルが開けません  ,MB_OK
|MB_ICONEXCLAMATION);
}

ss = Data_Write[0][0]+\n;

strcpy( mych, (const char *)ss );
fprintf(fp,mych);
}
fclose(fp);
}

インデントの方の理解が乏しいのでこれでいいかわからないのですが、変なとこありまし
たらすみません。

こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。
御教授願えたらと思います。度々すみません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

質問ヘタすぎ。

> こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。

「具合が悪い」だけで薬をくれる医者はいません。
どこの/なにが/どのようにダメなのですか?

コードべたっと貼って動きませんと泣きつくだけ?
回答者に間違い探しでもやらせるつもり?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。
だから、エラーメッセージの最初のコード4文字をNSDNで検索すれば説明が見れます。
内容によっては、対処方法のsつ名もあります。
それでも分らなければ、なにが分らないのか質問下さい。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

訂正です、
誤 内容によっては、対処方法のsつ名もあります。

正 内容によっては、対処方法の説明もあります。


返信引用
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

有難う御座います。
早速検索かけてみますm(_~_)m


返信引用
さち
 さち
(@さち)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

質問です

CSVファイルにレコードを保存するにあたって、今までは
 CString ss;
CString Data_Write[255][255] = {ss};

入力したものを変数(ss)に入れて、その変数ごと配列(Data_Write[255][255])の中に
格納してCSVの方に持っていく
という感じに考えていたんですけど、こういうのってできますか?

エラーはなくなりました。
void CCsvDlg::OnButton1()
{
char mych[30], mych1[30], mych2[30];
CString ss, ss1, ss2;

CEdit* myED1 = (CEdit*) GetDlgItem(IDC_EDIT1);
CEdit* myED2 = (CEdit*) GetDlgItem(IDC_EDIT2);

myED1 -> GetWindowText (ss1); //ED1の文字列を取り出
myED2 -> GetWindowText (ss2); //ここまではOK
strcpy( mych, (const char *)ss1 );
strcpy( mych1, (const char *)ss2 );

CString Data_Write[255][255] = {{mych},{mych1}};

今現在こんな感じになってるのですが、これでData_Write[255][255]の中にデータを入れ
ることは可能でしょうか?
どこで詰まってるのかわからないです・・


返信引用
翼
 翼
(@翼)
ゲスト
結合: 19年前
投稿: 11
 

こん

なぜCSVに追加するだけなのにCStringの二次元配列が必要かはわかりませんが・・・

このプログラムだと

Data_Write[0][0] に mych
Data_Write[1][0] に mych1

が入りますね


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

やりたいことは:
「ユーザ入力をCSV化した一行をCSVファイルの末尾に追加したい」ですね? ですね?

ならば方法はふたつ。

1. 読み込んで配列か何かに格納された既存データの末尾にユーザ入力による一行分を追加し、
配列全体をCSV化して新たにすべて書き込む(既存ファイルを書き潰す)

2. ユーザ入力をCSV化した一行を作り、既存ファイルを追加書き込みでオープンし、
  ファイル末尾に書き込んで閉じる。

のいずれかでしょう。どちらを選ぶかはあなたが決めること。
あなたはどちらを目論んでいますか?

それを踏まえて
> CString Data_Write[255][255] = {{mych},{mych1}};
なんでこんなことをしたいのですか/せなならんのですか?


返信引用
固定ページ 1 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました