行き詰まっています。お助けを。

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
熟爺

行き詰まっています。お助けを。

#1 投稿記事 by 熟爺 »

ヒョンな事から、息子より若い同僚とプログラムを作る事となりましたが、
同僚も私もプログラムの経験が無いため、困り果てています。
超初級の質問でご迷惑でしょうが、どなたか、お知恵を拝借したく
質問いたしました。
テキストファイルを読み込んで、それの末尾に、com1から読み込んだdataを
追加し、そのファイルを保存するものです。
皆さんのプログラムを参考にコピペしながら色々試しましたが、行き詰まっています。

コード: 全て選択


Sub dataapend(Path As String)

    Dim hFile          As Long
    Dim dwFileSize     As DWord
    Dim dwAccessByte   As DWord

    Dim buffer         As BytePtr
    Dim com1232cdata   As BytePtr
    Dim com1data       AS BytePtr

    '-------------------
    ' ファイル オープン
    '-------------------

    hFile=CreateFile(Path, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, _
                     ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    If hFile=INVALID_HANDLE_VALUE Then
        MessageBox(0,"ファイルオープンに失敗","TextEditor",MB_OK)
        Exit Sub
    End If

'ファイルサイズを取得し、バッファを確保する
    dwFileSize=GetFileSize(hFile,0)
    buffer=malloc(dwFileSize+1)

'ファイルの内容を文字列変数bufferに読み込む
    ReadFile(hFile,buffer,dwFileSize,VarPtr(dwAccessByte),ByVal 0)
    buffer[dwAccessByte]=0

    '**com1よりdata読み込み(騒音計)
    '**dataをcom1data とする
   com1data="12wq3,wedc,133,dew4,567,zsdef" '仮データ
                            '現ファイル表示-debug
                           MessageBox(0, buffer, "現在のファイル内容", MB_OK)
'文字列を結合し,1個の文字列とする
   lstrcat(buffer,com1data)
                           '新ファイルデータデータ表示-debug
                           MessageBox(0, buffer, "新テキスト内容", MB_OK)
'文字列の長さ取得
   dwFileSize=Len(buffer)
                            'ファイル長さ表示-debug
                           MessageBox(0,Str$(Len(buffer)), "新ファイルサイズ", MB_OK)


    '----------------
    ' ファイルへ保存
    '----------------

    '書き込む
    WriteFile(hFile,buffer,dwFileSize,VarPtr(dwAccessByte),ByVal 0)

    'ファイル ハンドルを閉じる
    CloseHandle(hFile)

    'バッファを解放する
    free(buffer)
End Sub


'***プログラムSTART
    Dim   Gfilename   As String
 Gfilename="騒音測定.txt"
 dataapend(Gfilename)
    end   
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#2 投稿記事 by マティ »

テキストファイルに追加モードでファイルを開くと、簡単に処理できます。
COMポートから取得したデータは、String型にしてご使用下さい。

コード: 全て選択


Sub dataapend(Path As String) 
    Dim com1data	AS String	'文字列としてデータを取得出来る物とします。

    '------------------- 
    ' ファイル オープン 
    '------------------- 
	Open Path For Append As #1
	'********************************************
	' com関連のプログラムは作成した事がないので
	' アドバイスできません
	'********************************************
    '---------------- 
    ' ファイルへ保存 
    '---------------- 
	Print #1, com1data
	Close #1
End Sub
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: 行き詰まっています。お助けを。

#3 投稿記事 by Tomorrow »

> ヒョンな事から、息子より若い同僚とプログラムを作る事となりましたが、
> 同僚も私もプログラムの経験が無いため、困り果てています。
そんなときの為のフォーラムです。がんがん利用しましょう。(^^);
> 超初級の質問でご迷惑でしょうが、どなたか、お知恵を拝借したく
> 質問いたしました。
> テキストファイルを読み込んで、それの末尾に、com1から読み込んだdataを
> 追加し、そのファイルを保存するものです。
> 皆さんのプログラムを参考にコピペしながら色々試しましたが、行き詰まっています。
すでに回答がありますが、元がAPI使用ということで..
> hFile=CreateFile(Path, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, _
> ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
ファイルを開く際、GENERIC_READアクセス権しか指定していないので、このままでは書き込みできません。
そこで、GENERIC_WRITE権も指定して、書き込み許可します。

またファイルに追加するだけなら、最初にファイルの存在を調べOPEN_EXISTINGモードで開いて、
SetFilePointer()でファイルポインタを進めれば簡単にできます。
ファイルの存在調査には、(本来の使い方ではないですが)GetFileAttributes()を使っています

関数を一部改変してます。ご了承ください。m(__)m

コード: 全て選択

Sub dataapend(Path As String)
	Dim hFile          As Long
	Dim dwCreateMode   As DWord

	Dim dwFileSize     As DWord
	Dim dwAccessByte   As DWord

	Dim com1232cdata   As BytePtr
	Dim com1data       AS BytePtr

	'ファイルの存在を調べる
	If GetFileAttributes(Path)=-1 Then
		'ファイルが存在しない -> 常に新規作成モードでオープン
		dwCreateMode=CREATE_ALWAYS
	Else
		'ファイルが存在する -> 追加モードでオープン
		dwCreateMode=OPEN_EXISTING
	End If

	'ファイルオープン
	hFile=CreateFile(Path, GENERIC_READ or GENERIC_WRITE, 0, ByVal 0, dwCreateMode, FILE_ATTRIBUTE_NORMAL, 0)
	If hFile=INVALID_HANDLE_VALUE Then
		MessageBox(0, "ファイルオープンに失敗", "NG", MB_OK or MB_ICONEXCLAMATION)
		Exit Sub
	Else
		MessageBox(0, "ファイルを作成しました", "OK", MB_OK)
	End If

	'ファイルポインタを終端に持ってくる
	If SetFilePointer(hFile, 0, NULL, FILE_END)=-1 Then Exit Sub

	'**com1よりdata読み込み(騒音計)
	'**dataをcom1data とする
	com1data=Ex"12wq3,wedc,133,dew4,567,zsdef\r\n" '仮データ
	'文字列の長さ取得
	dwFileSize=lstrlen(com1data)

	'----------------
	' ファイルへ保存
	'----------------

	'書き込む
	WriteFile(hFile,com1data,dwFileSize,VarPtr(dwAccessByte),ByVal 0)

	'ファイル ハンドルを閉じる
	CloseHandle(hFile)
End Sub
熟爺

行き詰まっています。お助けを。

#4 投稿記事 by 熟爺 »

マティ様 Tomorrow様
早速のRes有り難う御座います。2ヶ月前からABを始め、最初のルーティンで
3週間ほど悩んでいました。50半ば過ぎると脳みそが石みたいに硬くなり、何回読んでも
理解できないものでした。おかげ様で助かりました。
comの入出力でも又なやみそうでが。又判らない時はご指導お願いします。
皆様 本当に有り難う御座いました。今晩は美味しい晩酌に成りそうです。
返信する