2011-10-05 9 views
4

J'essaie de lire un fichier texte en C# et d'ajouter des numéros de ligne aux lignes.C# ajouter des numéros de ligne dans un fichier texte

Ce mon fichier d'entrée:

This is line one 
    this is line two 
    this is line three 

Et cela devrait être la sortie:

1 This is line one 
    2 this is line two 
    3 this is line three 

Ceci est mon code à ce jour:

class Program 
{ 
    public static void Main() 
    { 
     string path = Directory.GetCurrentDirectory() + @"\MyText.txt"; 

     StreamReader sr1 = File.OpenText(path); 

     string s = ""; 

     while ((s = sr1.ReadLine()) != null)   
     { 
      for (int i = 1; i < 4; i++) 
       Console.WriteLine(i + " " + s); 
      } 

      sr1.Close(); 
      Console.WriteLine();  
      StreamWriter sw1 = File.AppendText(path); 
      for (int i = 1; i < 4; i++) 
      { 
       sw1.WriteLine(s); 
      } 

      sw1.Close();    
    } 
} 

Je suis 90% sûr que je besoin d'utiliser pour le cycle pour obtenir les numéros de ligne là mais jusqu'à présent avec ce code, je reçois cette sortie dans la console:

1 This is line one 
2 This is line one 
3 This is line one 
1 this is line two 
2 this is line two 
3 this is line two 
1 this is line three 
2 this is line three 
3 this is line three 

C'est dans le fichier de sortie:

This is line number one. 
This is line number two. 
This is line number three.1 
2 
3 

Je ne sais pas pourquoi la variable chaîne s n'est pas utilisée lors de l'écriture dans le fichier même si elle est défini précédemment (un autre bloc, un autre règles peut-être?).

+1

commentaire général: Je pense qu'il est préférable d'utiliser (StreamReader) {} et d'utiliser (StreamWriter) {} block. Et aussi vous devriez nommer la '' ligne 'de votre variable, c'est plus clair, parce que c'est une ligne :) –

+1

Je ne sais pas si c'est un problème avec la question ou votre code, mais vos crochets ne correspondent pas . La boucle while est fermée plus tôt que vous ne le pensez à partir de votre indentation. – Ray

+1

Pourquoi gardez-vous la boucle de '1' '4'? Voulez-vous répéter chaque ligne quatre fois? –

Répondre

2
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 

namespace AppendText 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      string path = Directory.GetCurrentDirectory() + @"\MyText.txt"; 

      StreamReader sr1 = File.OpenText(path); 


      string s = ""; 
      int counter = 1; 
      StringBuilder sb = new StringBuilder(); 

      while ((s = sr1.ReadLine()) != null) 
      { 
       var lineOutput = counter++ + " " + s; 
       Console.WriteLine(lineOutput); 

       sb.Append(lineOutput); 
      } 


      sr1.Close(); 
      Console.WriteLine(); 
      StreamWriter sw1 = File.AppendText(path); 
      sw1.Write(sb); 

      sw1.Close(); 

     } 

    } 
} 
+0

Dans les questions de devoirs, il est habituel de ne pas donner une solution complète au problème. Votre programme concatène également le nouveau texte à l'ancien, ce qui n'est clairement pas souhaité. – Chris

+0

J'ai réussi à le changer et maintenant il crée un nouveau fichier en utilisant: StreamWriter sw1 = File.CreateText (Mytext2.txt); Alors maintenant, il crée un nouveau fichier. Toutefois. La sortie dans le fichier nouvellement créé est sur une ligne. Je sais que je dois changer le code dans la classe stringbuilder, et je suis capable d'insérer des caractères sur la ligne: sb.Append ("testing" + lineOutput); et ils apparaissent en face de chaque phrase de ligne, mais quand je veux insérer \ n pour une nouvelle ligne, cela ne marche pas. – Vojtech

+2

@Chris, désolé n'a pas réalisé que c'était devoirs. Supprimer mon post fera l'affaire ?! :) –

0

Vous devez ajouter le numéro de ligne à chaque chaîne de ligne. Découvrez String.Format. Essayez également une variable de compteur située en dehors de la boucle while pour conserver le nombre de lignes.

Espérons que cela suffise pour vous mettre sur la bonne voie sans vous donner la réponse exacte.

0

Etes-vous sûr de vouloir fermer le flux à l'intérieur de la boucle while?

+0

Je pense que le flux se referme après la boucle while, parce que c'est après la parenthèse} – Vojtech

1

STREAM OUVERT

lire toute la ligne et le stocker dans une variable temp. Utilisez un compteur pour suivre la ligne que vous avez lue. concatène le compteur avec la variable temp. Enregistrez-le dans le fichier. déplacez votre pointeur de ligne sur la ligne suivante et répétez .

CLOSE et VOTRE STREAM

2
IEnumerable<string> lines = File.ReadLines(file) 
           .Select((line,i)=>i + " " + line) 
           .ToList(); 
File.WriteAllLines(file, lines); 
+0

Je pense que tu n'as pas compris que c'était des devoirs, penses-tu vraiment que tu l'aides? –

+1

@BaptistePernet Comprendre mon code est assez de devoirs. Il va apprendre beaucoup en essayant de découvrir comment cela fonctionne. –

+1

@Hasan Absolument. Le but même de SO est d'éduquer à travers des réponses de qualité, pas seulement de laisser quelqu'un en finir avec ses devoirs. Merci. –

1

je pourrais vous fournir le bon code, mais parce qu'il est le travail de la maison, je vais vous question qui devrait vous conduire demander à la bonne réponse:

  • pourquoi fermez-vous le StreamReader le temps dans votre boucle? Vous pourrez toujours y accéder après, cela peut provoquer une erreur. Pourquoi avez-vous écrit dans votre StreamWriter sans l'index préfixé?
  • Pourquoi ouvrez-vous StreamWriter à l'intérieur de la boucle? Ne vaudrait-il pas mieux ouvrir StreamWriter et StreamReader en dehors de la boucle. Travaillez-vous dans la boucle, puis fermez les Streams?
0

Regardez la boucles FOR, vous les mettez dans le temps, donc, fondamentalement, vous dites:

while ((s = sr1.ReadLine()) != null) 

Chaque ligne de lecture

for (int i = 1; i < 4; i++) 

Répétez 3 fois par écriture.

En outre, vous fermez le flux dans le temps, donc après la première ligne lire.

0

Voici un enjeu majeur pour vous:

 for (int i = 1; i < 4; i++) 
      Console.WriteLine(i + " " + s); 
     } 

Vous fermez la boucle avec une accolade, mais ne pas utiliser une accolade pour l'ouvrir. Cela signifie que l'accolade citée ci-dessus est en train de fermer la boucle while pour que vous puissiez boucler toute la console.writeline et quand vous arrivez à écrire dans le fichier, vous ne lisez pas du tout le fichier - "" est dû à la portée.

+0

l'accolade fermante appartient à la boucle while (l'indentation est fausse), la boucle for n'a pas les deux accolades. –

+1

@Giuseppe R: Je pense qu'il est plus probable qu'en fait les parenthèses sont erronées plutôt que la boucle while étant terminée intentionnellement, mais je suis heureux d'être corrigé. Dans les deux cas, il y a certainement une erreur car la boucle while ne peut rien faire d'utile car il est clair que les actions que vous voulez écrire dans un fichier doivent être faites pour chaque ligne lue. – Chris

Questions connexes