#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: 印刷用のコードをここに追加してください。
}
/////////////////////////////////////////////////////////////////////////////
// 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();
}
…なにこれ?
長文ですみません。
今現在CSVファイルの読み込みとリストビューへの表示ができるといった状況です。
これに「レコードの追加」を加えたいのですが、自分にはできません。
ダイアログ画面から入力してそれをCSVファイルの中のレコードとして追加したいのです
が、どうしたらいいでしょうか?
我侭なこと言うようですが、もしよろしければサンプルやヒントという形でお教え願えま
せんか?なんとしても自分の身につけたいので・・・
ホント我侭ですみません。
宜しくお願い致します。m(_ _)m
で、インデントも付けずにべたーっと貼ったコードにどんな意味があるのでしょうか?
こんなもん、だれも読んでくれませんよ。
Document/View-アーキテクチャも無視してるみたいだし。
> ダイアログ画面から入力してそれをCSVファイルの中のレコードとして追加したいのです
が、どうしたらいいでしょうか?
1. CSVファイルを追加書き込みモードでオープンする
2. ダイアログから得られた入力をカンマで繋いで[1]に書き込む
3. [1]を閉じる。
おしまい。
先にインデントについて、失礼しました。以後気をつけます。
御返答有難う御座います。
ニュアンスは掴めたと思います。
うまくいきません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);
}
インデントの方の理解が乏しいのでこれでいいかわからないのですが、変なとこありまし
たらすみません。
こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。
御教授願えたらと思います。度々すみません。
質問ヘタすぎ。
> こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。
「具合が悪い」だけで薬をくれる医者はいません。
どこの/なにが/どのようにダメなのですか?
コードべたっと貼って動きませんと泣きつくだけ?
回答者に間違い探しでもやらせるつもり?
>こんな感じで書いてみたのですがエラーが出るばっかりで進展が見られません。
だから、エラーメッセージの最初のコード4文字をNSDNで検索すれば説明が見れます。
内容によっては、対処方法のsつ名もあります。
それでも分らなければ、なにが分らないのか質問下さい。
訂正です、
誤 内容によっては、対処方法のsつ名もあります。
正 内容によっては、対処方法の説明もあります。
有難う御座います。
早速検索かけてみますm(_~_)m
質問です
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]の中にデータを入れ
ることは可能でしょうか?
どこで詰まってるのかわからないです・・
こん
なぜCSVに追加するだけなのにCStringの二次元配列が必要かはわかりませんが・・・
このプログラムだと
Data_Write[0][0] に mych
Data_Write[1][0] に mych1
が入りますね
やりたいことは:
「ユーザ入力をCSV化した一行をCSVファイルの末尾に追加したい」ですね? ですね?
ならば方法はふたつ。
1. 読み込んで配列か何かに格納された既存データの末尾にユーザ入力による一行分を追加し、
配列全体をCSV化して新たにすべて書き込む(既存ファイルを書き潰す)
2. ユーザ入力をCSV化した一行を作り、既存ファイルを追加書き込みでオープンし、
ファイル末尾に書き込んで閉じる。
のいずれかでしょう。どちらを選ぶかはあなたが決めること。
あなたはどちらを目論んでいますか?
それを踏まえて
> CString Data_Write[255][255] = {{mych},{mych1}};
なんでこんなことをしたいのですか/せなならんのですか?