2016-09-27 3 views
-1

プログラムで配列要素の値を認識するのに問題があります。私はそれが次の要素を '、'の後に読む必要があり、すべての本(それはライブラリプログラム)のためにループする必要があります。私のforループで "10"(ランダムに数字を入れてエラーを表示しないようにする)を変更する方法を理解していないので、.txtからすべての情報を読み込んだ後にプログラムが停止します。コード: EDIT:。それは、それ以上のエラーが表示されない、それはちょうど今クラッシュ:(C#のいくつかの問題:プログラムは私の配列からファイルを読み取っていないので、line.splitに問題がある

using System; 
using System.IO; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 


      foreach (string line in File.ReadAllLines(@"Duomenys.txt")) 
      { 
       string[] a = line.Split(','); 
       int ISBN = int.Parse(a[0]); 
       string BookName = a[1]; 
       string Author = a[2]; 
       string Genre = a[3]; 
       string Publisher = a[4]; 
       int PublishYear = int.Parse(a[5]); 
       int PageNumber = int.Parse(a[6]); 
       Console.WriteLine(PublishYear); 
       Console.WriteLine(); 
       Console.ReadKey(); 

      } 
     } 

     public void BookWithTheMostPages(int[] a) 
     { 
      int maxPages = 0; 
      string[] lines = File.ReadAllText(@"Duomenys.txt").Split('\n'); 
      foreach (string line in lines) 
      { 
       { 
        Console.ReadLine(); 
        if (a[6] > maxPages) 
        { 
         maxPages = a[6]; 

         Console.WriteLine("Storiausios knygos pavadinimas: {0} , jos autorius(-ė): {1}", a[1], a[2]); 
        } 
       } 
      } 
     } 

     public void Publish(string[] a) 
     { 
      if (!File.Exists(@"Technologija.csv")) 
       File.Create(@"Technologija.csv").Dispose(); 
      using (StreamWriter streamwrite = new StreamWriter(File.OpenWrite(@"Technologija.csv"))) 
      { 
       if (a[2] == "Technologija") 
       { 
        streamwrite.WriteLine("\n ISBN : {0}, Pavadinimas: {1}, Autorius: {2}, Tipas: {3}, Leidykla: {4}, Išleidimo Metai: {5}, Puslapių skaičius: {6}", a[0], a[1], a[2], a[3], a[4], a[5], a[6]); 
       } 
      } 
     } 

     public void Output(string[] a) 
     { 
      if (!File.Exists(@"Autoriai.csv")) 
       File.Create(@"Autoriai.csv").Dispose(); 

      using (StreamWriter streamWriter = new StreamWriter(File.OpenWrite(@"Autoriai.csv"))) 
      { 
       streamWriter.WriteLine("\n{0}", a[2]); 
      } 
     } 
     public void Publishyear(string[] a) 
     { 
      if (a[5] == "2014") 
      { 
       for (int j = 1; j <= 5; j++) 
        Console.WriteLine("\nKnygos ISBN: {0}, Pavadinimas {1}, Autorius {2}", a[0], a[1], a[2]); 
      } 
     } 
    } 
} 

はここです.TXT例:

9781408855669、ハリー・ポッターと秘密の部屋、ジョアン・K・ローリング、Apysaka、ブルームズベリー出版PLC、1998、270(それは1行です)

+0

ブレークポイントを設定し、デバッグして、エラーの発生場所を確認します。 –

+1

そのコードには多くの間違いがあります。私はそれがコンパイルされるとは思わない... – Pikoh

+0

'using'行の目的は何ですか?ファイルを開いて、それを閉じて処分するだけです。あなたの 'foreach'ステートメントも最後にセミコロンがあるため何もしません。 –

答えて

0

alineは静的Mainにスコープされています方法(実際には、aの2回Mainで定義されていますが、これは正当ではありません)。それらはパラメータとして渡すか、フィールド経由で利用できるようにしない限り、そこには存在しません。あなたはおそらく:

  • より意味のある名前が思い浮かぶでしょう。今あなたに - aはあなた
  • はあなたがインスタンスまたはstaticコンテキストで作業しているかどうかを決定
  • (IMOこれはフィールドよりもきれいになりますが、フィールドは、あまりにも動作します)パラメータとして値を渡し助けにはなりません両方持っているが、あなたはのいずれかの方法usingforeachないがそのように終了する必要があることを

注意を呼び出すことができなくなりますので、オブジェクトをインスタンス化しません。あなたはおそらく意味:

foreach (string line in File.ReadAllLines(@"Duomenys.txt")) 
{ 
    string[] a = line.Split(','); 
    ... 
} 

あなたがそれを使用していない場合は、全てのよし(using/StreamReaderは必要ありません)

0

ので、まず、

using (StreamReader dn = new StreamReader(@"Duomenys.txt")); 

を削除します。 File.ReadAllLinesでファイルを読んでいるなら、それは必要ないでしょう。また、foreachループを正しく使用していません。あなたが行きたい道はこのようなものになるだろう:私はaswell固定何

foreach (string line in File.ReadAllLines(@"Duomenys.txt")) 
{ 
    string[] a = line.split(','); 
    int ISBN = Convert.ToInt32(a[0]); 
    string BookName = a[1]; 
    string Author = a[2]; 
    string Genre = a[3]; 
    string Publisher = a[4]; 
    int PublishYear = Convert.ToInt32(a[5]); 
    int PageNumber = Convert.ToInt32(a[6]); 
} 

あなたが最初という名前の文字列の配列を作成したが、その後は動作しませんという名前の通常の文字列を作成することです。配列のサイズを設定する必要もなく、string.Split()はこれを自動的に行います。

EDIT:ループへのファイルの行、彼らは行末で区切らされていると仮定すると、あなたがこれを行うことができます:

string[] lines = File.ReadAllText(filename).Split('\n'); 
// '\n' as the regular line terminator 
foreach (string line in lines) 
{ 
    // Your other code ... 
+0

両方のおかげで、初心者なので、これはすべて私には新しいものです:D。 あなたたちはline.splitエラーを修正しました。 パラメータを正確に転送するにはどうすればよいですか? そして、10のループでは、どのようにしてそれを変更して、読み込めるtxtの情報がなくなってからループを止めますか? :) – JustasRatke

+0

@JustasRatke私の編集をチェックしてください:) –

+0

私はまだそれをやったかどうか分かりませんが、エラーはないので、うまくいくと思います。 :) – JustasRatke

0

を「」のみ主な機能に存在します。 Marc氏のように、別の関数で使用している場合は、パラメータとして 'a'を渡したいと思うでしょう。

だから、関数の最初の行:

public void BookWithTheMostPages() { 

} 

は次のようになります。

public void BookWithTheMostPages(string[] a) 

そして、このようなメイン機能で呼び出される必要があります。

BookeWithTheMostPages(a); 

こと-A-どのように機能が "何"かを知っている方法。

はまた、私はあなたが書いた関数のいずれかを実行するために、あなたの主な機能を語っていないことに注意してください。このプログラムは、Main.csファイルのすべてではなく、Main関数内のすべてを実行します。したがって、あなたの 'Publishyear'、 'Output'、 'Publish'、 'BookWithTheMostPages'の機能は単に動作していません。今すぐあなたのSplit関数に関して、ここで働いていない

は、2つのことです:

  1. あなたはすでに何かの名前を持っている「」あなたのプログラムでは、同じ名前で別の変数に名前を付けることはできません。理にかなっている?
  2. あなたが別の配列に「分割」しなければならない、スプリット文字列

のシリーズを返しますので、だから、次のようになります。

string[] splitLine = line.split(','); 

はまた、これらのラインには正しくありません:

あなたがintを返すように「PublishYear」と「ページ番号」の機能を持っているしたいとしている場合
int PublishYear = Convert.ToInt32(a[5]); 
int PageNumber = Convert.ToInt32(a[6]); 

、彼らは無効機能することはできません。

public int Publishyear() { 
    /*Write your code in here*/ 
    return year; 
} 

その後、あなたは値を取得するには、このような関数を使用することができます。

int i = Publishyear(); 

「PageNumber」機能は同じです。

はまだ私が言及していないプログラムではほとんどのエラーがたくさんありますし、それがexplinationでみんなを書き留めて永遠にかかるだろうが、あなたのような初心者のための作品でそれを作品を取ります。

  1. プログラムが紙面上で行うべきことを書き留めてください。
  2. コードの小さな部分(結合線)
  3. テストを書きます。
  4. 終了するまで手順2と3を繰り返します。

最後に、よりわかりやすい名前で変数の名前を付ける習慣をつけてください。 'a'は読者に「a」が何であるかを一目で分かりません。他の人が読むのが簡単なコードを書く。私はプログラミングが非常に難しくて混乱しているように見えるかもしれませんが、それを諦めないでください。そして少しずつあなたはこの全プログラミングの事柄を理解するでしょう。

乾杯!

+0

本当にありがとう、それは私の問題のほとんどを解決し、今プログラムがクラッシュし、私は本当になぜ笑を知らない。 – JustasRatke

+0

ブレークポイントが発生したかどうかはわかりませんが、この記事をご覧ください:[リンク](https://msdn.microsoft.com/en-us/library/5557y8b4.aspx)プログラムを1行ずつ調べ、プログラムの仕組みを確認することができます。幸運な友達! –

+0

問題はISBNのようですが、ISBNを読み込もうとするとクラッシュします。 :( – JustasRatke