■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#7392-0
ソートされたテキストファイルにデータを書き込むには
どうも、おせわになります。

テキストボックスに入力したデータをファイルに書き込む、
書き込む際に入力されたデータを昇順になるように
正しい位置に書き込む。

テキストファイルの中身は数値でMAXが1024です。
どのようにすれば良いのでしょう?


Dim data as Integer     'テキストファイルから読み込んだデータ
Dim input as Integer    '入力されたデータ
Dim count as Integer    '行数をカウントする

Open "Test.txt" For Input As #1
   Do 
       If EOF(1) Then Exit Do
          Input #1, data
             If data > input Then
                 カウントされた行 +1の所にデータを挿入する
         ループを抜ける
                 
    Else: count = count + 1  

  Loop

Close #1,


自分ではこのような感じの処理を考えているのですが・・・
どうなのでしょうか?よろしくおねがいします。
#7396-0
RE#7392:ソートされたテキストファイルにデータを書き込むには
数値は1024が上限だそうですが,下限はいくつ?
下限値でも4桁(-999まで)だったならば、フォーマットを指定して、
1行が必ず(4文字+vbCrLf)になるようにしておいて、ランダムアクセス
すればスピードアップになります。
でもTronさんの方法でも問題はないと思いますよ。文法に気をつけてね。
(End IFがないとか、FreeFileを使おうとか、OutPutモードで開こうとか)
#7397-0
RE#7396:ソートされたテキストファイルにデータを書き込むには
返事ありがとうございます。


> 数値は1024が上限だそうですが,下限はいくつ?

下限は0000です。
フォーマットとしては 0000〜1024 となります。

> 下限値でも4桁(-999まで)だったならば、フォーマットを指定して、
> 1行が必ず(4文字+vbCrLf)になるようにしておいて、ランダムアクセス
> すればスピードアップになります。

1行が必ず(4文字+vbCrLf)との事ですが
分からないのですみませんが具体的に書いてもらえないでしょうか?


また、スピードUPとありますがどの程度速くなる物なのでしょうか?
目に見えて早くなるのでしょうか?
#7404-0
RE#7392:ソートされたテキストファイルにデータを書き込むには
えっと、説明するのが面倒なので、コードで…。(本末転倒?)

フォーム上に、ListBox コントロールをひとつ貼って、Sorted プロパティを True にしておいて
ください。 さらに、入力用の TextBox と、追加イベント発生用のボタンをひとつ貼って下さい。

Const cFile As String = "c:\test.txt"

Private Sub Command1_Click()
    Dim iw As Integer

    List1.AddItem Right("   " + CStr(Val(Text1.Text)), 4)
End Sub

Private Sub Form_Load()
    Dim cw As String

    List1.Clear
    If Dir(cFile) = "" Then Exit Sub

    With List1
        .Visible = False

        Open cFile For Input As #1
        While EOF(1) = 0
            Line Input #1, cw
            .AddItem Right("   " + cw, 4)
        Wend
        Close #1

        .Visible = True
    End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dim i As Integer

    With List1
        Open cFile For Output As #1
        For i = 0 To .ListCount - 1
            Print #1, .List(i)
        Next i
        Close #1
    End With
End Sub

あ、元のファイル内容を書き換えてしまうので、既存の Test.txt ファイルがあるのなら、バック
アップを取っておいた方が良いですよ。

やりたい事って、こんな感じでしょうかね?
#7406-0
RE#7397:ソートされたテキストファイルにデータを書き込むには
こんばんは。ふるふる@実家です。

> 1行が必ず(4文字+vbCrLf)との事ですが
> 分からないのですみませんが具体的に書いてもらえないでしょうか?

Put #iFno, Format(sData,"0000") & vbCrLf
だと思います。家では確かめられないので自分で調べてください。

これぐらいのファイルサイズではそれほど違いはないと思いますが、Tronさんの
ロジックでは最悪、1024回のループになってしまいます(1024回のファイルアクセス)。
ランダムアクセスではループの必要がなく、ファイルアクセスも最小限ですみます。
#7411-0
RE#7406:ソートされたテキストファイルにデータを書き込むには
ふるふる@会社です。

ランダムアクセスで実験してました。put ステートメントでは必ず
2バイトの制御文字が入ってしまうので、テキストファイルになってくれませんでした。

なので、私なりの回答です。

Public sData(1 to 1024) as String *4   ' ファイルの内容を取りこむバッファ
Public sFile = "C:\test.txt"
Public Const DataLen = 6

Private Sub Prepare()
'1行4文字×1024行のファイルを作る。すでにあるなら必要ない
dim I as integer,iFNo as integer
iFno = freefile
Open sFile for output as #iFno
for I = 1 to 1024
    print #iFno,space(4)
next
Close #iFno
End Sub

Private Sub test()
Dim iFno as Integer,iPos as Integer
 iPos = cint(text1.text)
 sData(iPos) = text1.text
 iFno = freefile
 Open sFile for output as #iFno
  Seek #iFno, DataLen * (iFno - 1) + 1
  Print #iFno,sData(iPos)
 Close #iFno
End Sub

これはSeekステートメントを使うためのロジックです。ふつう、数値だけのファイルなら
バイナリファイルにするのですが、テキストファイルということなので、Seekステートメント
で正確に位置を割り出すために、1024行のファイルを作ってしまってます。
#7421-0
RE#7411:ソートされたテキストファイルにデータを書き込むには
ふるふるさん
>日をまたがって回答有難う御座います。


知らないコマンドもあるのでヘルプを見て勉強中の為
まだプログラムは動いていませんが本当に有難う御座いました。
初心者の為、また分からない事があればお聞きすることが
あるかも知れませんがそのときは、またよろしくおねがいします。
#7425-0
RE#7421:ソートされたテキストファイルにデータを書き込むには
> 知らないコマンドもあるのでヘルプを見て勉強中の為
> まだプログラムは動いていませんが本当に有難う御座いました。
出力には・・・
他にも文字列変数に出力結果をすべて設定してから
Print#ステートメント一発で・・・とかも
StrTemp = strTemp & "0123" & vbCrLf
:
Print #intFileNumber, strTemp

読込みも・・・
同様に文字列変数にすべて読み込み、文字列操作の
関数で6文字で1レコードそのうちの先頭4文字が
データ・・・という感じにも出来ます。


ユーザ定義型を使用したサンプルを載せます
<コントロール>
リストボックスコントロール1個(List1)
コマンドボタンコントロール2個(Command1,Command2)
<コード>
Option Explicit
Private Type myRec
  strField1 As String * 4 'Data(半角4文字)
  strField2 As String * 2 'CrLf(改行用ダミー)
End Type
Private Sub Form_Load()
  Command1.Caption = "読込み"
  Command2.Caption = "書き込み"
End Sub
Private Const FILE_NAME = "Test1.Txt"
Private Sub Command1_Click()
Const REC_LENGTH = 6
  Dim myRecord() As myRec
  Dim intFileNumber As Integer
  Dim i As Long

  intFileNumber = FreeFile
  Open FILE_NAME For Binary As #intFileNumber
  ReDim myRecord(0 To (LOF(intFileNumber) \ REC_LENGTH) - 1)
  Get #intFileNumber, , myRecord
  Close #intFileNumber

  With List1
    .Visible = False
    .Clear
    For i = LBound(myRecord) To UBound(myRecord)
      .AddItem myRecord(i).strField1
    Next i
    .Visible = True
  End With
End Sub
Private Sub Command2_Click()
  Dim myRecord() As myRec
  Dim intFileNumber As Integer
  Dim i As Long, j As Long

  With List1
    j = .ListCount - 1
    ReDim myRecord(0 To j)
    For i = 0 To j
      myRecord(i).strField1 = .List(j - i)
      myRecord(i).strField2 = vbCrLf
    Next i
  End With

  intFileNumber = FreeFile
  'ファイルサイズが変更になった場合を想定して
  '元のファイルの内容を消去します
  Open FILE_NAME For Output As #intFileNumber
  Close #intFileNumber

  Open FILE_NAME For Binary As #intFileNumber
  Put #intFileNumber, , myRecord
  Close #intFileNumber
End Sub

ヘルプ参照
「Type ステートメント」
「ファイル,」
「文字列,」
あと関連項目・使用例なども

※ちなみに、Input ステートメントでInteger型の変数に
 読み込むのはよろしくないです。

 数値として扱う必要があれば、文字列型に読み込んでから
 Intger型に型変換を行ってからにした方が良いでしょう。

 VBでは自動で「型変換」が行われる場合がありますが、
 しっかり「型」を意識しておいた方が今後役立ちます。
このページと関連する記事:
#16171-0ファイルが見つからない!?2001-05-18(金) 11:14
#10926-0「開く」と「名前を付けて保存」に関する質問2000-08-27(日) 22:46
#17494-0テキストファイルの最後の文をラベルに表示2001-08-30(木) 12:03
#20200-0listの取得について2001-04-11(水) 16:37
#22737-0テキストファイルの行をソート2001-08-28(火) 18:19
#7782-0リストボックスの書き出し2000-04-27(木) 17:29
#711-1バイナリーデータの読み込み、書き込み2002-09-06(金) 14:11
#8840-0バイナリ出力 関数 ? ? ? ?2000-06-16(金) 17:07
#11728-1バイナリ出力 関数 ? ? ? ? (はじめたばかり)から移動2000-06-16(金) 18:29
#14742-0CSV読込み時の動的配列2001-02-27(火) 12:14
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)