2017-04-12 21 views
0

私は、自宅でVisual Studio 2010または2017を使用してレベルプロジェクト用のプログラムを作成しようとしています。コンソールアプリケーションを使用しています。私が必要とするのは、教師がプログラムに入力した生徒の詳細を含むテキストファイルを作成することです。次に、教師は特定の生徒ID番号を入力し、この生徒の記録の最後にスコアを追加できるようにする必要があります。 これはこれまでの私のコードです。しかし、教師は生徒の詳細を入力してそれをテキストファイルに書き込むことができます。ビジュアルベーシックのテキストファイルの特定の行にテキストを追加するにはどうすればよいですか?

Dim studentID As String 
    Dim studentname As String 
    Dim classname As String 

    Dim Filename As String 
    Filename = “Students.txt” 
    FileOpen(1, Filename, OpenMode.Append) 

    Console.WriteLine("         Student Setup") 
    Console.WriteLine() 
    Console.WriteLine() 

    Console.Write("Student ID: ") 
    studentID = Console.ReadLine 
    Console.Write("Student Name: ") 
    studentname = Console.ReadLine 
    Console.WriteLine() 
    Console.Write("Class : ") 
    classname = Console.ReadLine 
    WriteLine(1, studentID, studentname, classname) 

    Console.WriteLine("Student successfully setup.") 

は今、私は教師が生徒のID番号とスコアを入力することができ、その後、学生IDで始まるテキストファイル内の特定の行の最後にスコアを書くことができるようにしたいです数。

"12345"、 "アダム"、 ""

"67534"、 "アリス"、 ""

」:

テキストファイルの例は次のようになります。 21456" 、 "ボブ"、 ""

"98765"、 "チャールズ"、 ""

"87654"、 "デニス"、 ""

次​​に、教師がスコアを追加する生徒ID番号として21456を入力し、スコア6を入力すると、テキストファイルの行がこのように表示されるように、この行の最後に6が追加されます:

「21456」、「ボブ」、「A」、「6」私は、私は別のフォーラムからもらったし、私が望んでやって変更しようとした次のコードでこれを行うことを試みてきた

行うには:

Dim score As Integer 
    Dim studentIDenter As String 
    Dim count As Integer 

    Console.Write("Student ID to add score to: ") 
    studentIDenter = Console.ReadLine 
    Console.Write("Student score: ") 
    score = Console.readline 

    Dim lines() As String = System.IO.File.ReadAllLines(Filename) 
    For count = 0 To lines.Length - 1 
     If lines(count).StartsWith(studentIDenter) Then 
      lines(count) = studentID & studentname & classname & score 
      System.IO.File.WriteAllLines(Filename, lines) 
     End If 
    Next 

    FileClose(1) 
+0

"更新"コードの問題点は何ですか? – Pikoh

答えて

0

を私は、ユーザーが学生の数とスコアの周りませ入る引用符であると仮定します。

行の先頭に一致するかどうかのチェックに引用符を追加する必要があります。さらに、行の末尾にカンマや引用符を追加すると、スコアの前後にカンマを追加する必要があります。

変更するには:

For count = 0 To lines.Length - 1 
    If lines(count).StartsWith(Chr(34) & studentIDenter & Chr(34)) Then 
     lines(count) = lines(count) & "," & Chr(34) & score & Chr(34) 
     System.IO.File.WriteAllLines(Filename, lines) 
     Exit For ' found the record, no need to keep looking 
    End If 
Next 
0

私は次のように作成した:

Sub Main() 
    Dim studentID As String 
    Dim studentname As String 
    Dim classname As String 

    Dim addScoreSelection As String 

    Dim inputSID As String 

    Dim Filename As String 
    Filename = “Students.txt” 
    FileOpen(1, Filename, OpenMode.Append) 

    Console.WriteLine("Add a Score? Y/N") 
    addScoreSelection = Console.ReadLine.ToLower() 

    If addScoreSelection = "Y".ToLower() Then 
     FileClose(1) 
     Console.WriteLine("Enter a student ID: ") 
     inputSID = Console.ReadLine() 
     AddScore(inputSID) 
    ElseIf addScoreSelection = "N".ToLower() Then 
     Console.WriteLine("Student Setup") 
     Console.WriteLine() 
     Console.WriteLine() 

     Console.Write("Student ID: ") 
     studentID = Console.ReadLine 
     Console.Write("Student Name: ") 
     studentname = Console.ReadLine 
     Console.WriteLine() 
     Console.Write("Class : ") 
     classname = Console.ReadLine 
     WriteLine(1, studentID, studentname, classname) 

     Console.WriteLine("Student successfully setup.") 
    Else 
     Console.WriteLine("No selection made. Exiting.") 
     Process.GetCurrentProcess.Kill() 
    End If 


End Sub 

Sub AddScore(ByVal ID As String) 
    Dim Filename As String 
    Filename = “Students.txt” 

    Dim fileContent As String() 

    Dim index As Integer = 0 

    fileContent = IO.File.ReadAllLines(Filename) 

    For Each line As String In fileContent 
     If line.Contains(ID) Then 
      fileContent(index) = fileContent(index) & ",""6""" 'Pass in a ByVal param for this 
      Exit For 
     End If 
     index += 1 
    Next 

    IO.File.WriteAllLines(Filename, fileContent) 
End Sub 

私は、文字列のparamとして学生証を取るサブルーチンAddScoreを追加して、私は、このパラメータを使用します.Contains()を使用して、私が興味のある行をテキストファイルに置いた時を特定します。

私はラインが発見されると、私は最後まで得点を追加し、問題の行を探して、配列を繰り返し処理ファイルから

fileContent = IO.File.ReadAllLines(Filename) 

をすべてのテキストを読むことによって、文字列の配列を作成ラインは、私は、ファイル

IO.File.WriteAllLines(Filename, fileContent) 
に文字列配列を書き込む

For Each line As String In fileContent 
     If line.Contains(ID) Then 
      fileContent(index) = fileContent(index) & ",""6""" 'Pass in a ByVal param for this 
      Exit For 
     End If 
     index += 1 
    Next 

(おそらく、実際にここでのparamを使用したいと思うでしょう) 0

これはあなたの問題を解決しますが、個人的に私はこれに満足していません。たくさんのテキストをつかんでメモリに入れるというアイデアは好きではありません(私たちが5GBのファイルを読んでいると想像してください...)。長期的には、FileStreamクラスを使用して読み書きし、その行を見つけてその行にテキストを追加するのが最善の解決策です。

+0

ありがとう、まさに私はそれがやりたいと思っていたものです!テキストファイルを使用するようにしか教えられていないので、もっと効率的な場合は、ファイルストリームクラスを使用する方法を学習します。 – KP0804

+0

また、コメントではどういう意味ですか: 'これでByValパラメータを渡してください。申し訳ありませんが、これは何か基本的なものですが、私は教師がスコアを入力できるようにその行を変更しようとしましたが、うまく動作しませんでしたか? – KP0804

+0

Np、これが問題を解決した場合は、答えとしてマークしてください。私がParamと言うときは、 "ByVal Scoreを文字列として" AddScore sub rotuinに追加すると、スコアの入力をして行の最後に追加することができます。値、6) –

関連する問題