CodeGym /Cours /C# SELF /Écriture de fichiers texte :

Écriture de fichiers texte : StreamWriter

C# SELF
Niveau 36, Leçon 3
Disponible

1. Introduction

StreamWriter — c’est une des classes clés de l’espace de noms System.IO dans .NET, faite pour écrire facilement des données texte dans des fichiers via un flux.

Pourquoi ne pas bosser direct avec FileStream ?
FileStream ne gère que des octets. Si tu veux écrire une chaîne avec, tu dois convertir le texte en octets toi-même et gérer l’encodage (tu vas vite vouloir revenir à StreamWriter).
StreamWriter s’occupe de tout ça pour toi : tu lui files une chaîne — il écrit les bons octets dans le fichier.

Les gros avantages :

  • Tu peux écrire des chaînes sans te prendre la tête avec la conversion en octets.
  • Il y a des méthodes pour écrire du texte ligne par ligne.
  • Tu peux gérer le buffering et l’encodage (et on va voir comment faire).

Exemple tout simple

using System.IO;

string path = "output.txt";

using (StreamWriter writer = new StreamWriter(path))
{
    writer.WriteLine("Salut, le monde !");
    writer.WriteLine("C’est la deuxième ligne.");
}
// Quand tu sors des accolades du using, StreamWriter libère le fichier à coup sûr.

Qu’est-ce qui se passe ici ?

  • Le fichier est ouvert en écriture (s’il n’existe pas — il sera créé).
  • Chaque chaîne est écrite comme une ligne séparée dans le fichier (méthode WriteLine).
  • Après le bloc using, le fichier est fermé automatiquement, même s’il y a une erreur.

Si tu ouvres le fichier output.txt après avoir lancé ce programme, tu verras deux lignes de texte, exactement comme prévu.

Un point important

Si le fichier existe déjà, il sera réécrit à zéro ! Tout ce qu’il y avait dedans — disparu. Donc fais gaffe : ne stocke pas ta thèse ou la seule facture d’électricité dans ce genre de fichiers.

2. Écriture de données dans le flux

Les méthodes principales de StreamWriter

Méthode Description
Write(string)
Écrit une chaîne sans retour à la ligne
WriteLine(string)
Écrit une chaîne avec retour à la ligne
Flush()
Force l’écriture du buffer dans le fichier (rarement à faire à la main)
Close()
/
Dispose()
Ferme le flux et libère la ressource (c’est ce que fait using)
BaseStream
Accéder au flux de base (genre FileStream)

Méthode Write()

Écrit des données sans aller à la ligne. Tout ce que tu écris après sera sur la même ligne dans le fichier.

Méthode WriteLine()

Écrit des données en ajoutant automatiquement le caractère de fin de ligne (\r\n sous Windows, \n sous les OS type Unix).
C’est comme si tu appuyais sur Entrée après chaque écriture.

Write() vs WriteLine() : démo de la différence

using (var writer = new StreamWriter("example.txt"))
{
    writer.Write("Premier ");
    writer.Write("paragraphe. ");
    writer.WriteLine("On a fini la ligne, Entrée !");
    writer.Write("Deuxième paragraphe.");
}

Maintenant, example.txt ressemblera à ça :

Premier paragraphe. On a fini la ligne, Entrée !
Deuxième paragraphe.

3. Gérer les encodages

Par défaut, quand tu crées un StreamWriter sans rien préciser, il utilise l’encodage UTF-8 avec BOM (Byte Order Mark).

En pratique, c’est pratique et moderne, mais parfois tu dois préciser l’encodage — genre pour être compatible avec de vieux programmes ou des données importées.

Comment préciser l’encodage ?

// Écriture d’un fichier en encodage Windows-1251 (cyrillique pour les vieux systèmes)
using (var writer = new StreamWriter("cyrillic.txt", false, System.Text.Encoding.GetEncoding("windows-1251")))
{
    writer.WriteLine("Salut, monde cyrillique !");
}

Point important :
L’encodage doit être supporté sur le système. Si t’es pas sûr — reste sur UTF-8.

4. Paramètres supplémentaires du constructeur

On va jeter un œil sous le capot de StreamWriter :

public StreamWriter(
    string path,              // chemin du fichier
    bool append = false,      // ajouter à la fin du fichier ?
    Encoding encoding = null, // encodage
    int bufferSize = 1024     // taille du buffer, en octets
)
  • append — si false (par défaut), le fichier sera réécrit. Si true, les nouvelles lignes seront ajoutées à la fin.
  • encoding — l’encodage utilisé.
  • bufferSize — la taille du buffer interne pour accélérer l’écriture de gros volumes de données.

Exemple : ajouter à un fichier existant

// Le fichier sera complété, pas réécrit
using (var writer = new StreamWriter("log.txt", append: true))
{
    writer.WriteLine(DateTime.Now + " -- Nouvel événement");
}

5. Astuces utiles

Ce qui se passe quand tu ajoutes ou réécris

Mode Que fait-il ? Résultat dans le fichier
append: false Réécrit tout à zéro Les anciennes données sont effacées
append: true Ajoute de nouvelles lignes à la fin Les anciennes lignes restent

Astuce : Le mode ajout (append: true) — c’est top pour faire des logs, quand tu veux garder l’historique des événements.

StreamWriter et les gros volumes de données

  • StreamWriter bufferise l’écriture : les vraies données arrivent dans le fichier un peu après que tu as appelé WriteLine. Mais après avoir fermé le flux (ou appelé Flush()), tout est garanti sur le disque.
  • L’écriture avec WriteLine est super efficace pour écrire ligne par ligne. Pour des formats plus complexes (JSON, CSV ou XML), utilise les libs adaptées, ou fais gaffe à bien échapper les caractères spéciaux (genre virgules ou guillemets).

Comment bien finir l’écriture et libérer les ressources

La bonne façon : utilise toujours using !
Comme ça, tu es sûr que le fichier sera fermé, même si une exception arrive (genre si le disque est soudainement "plein" ou si un autre programme bloque le fichier).


flowchart TD
    A[Création de StreamWriter] --> B[Travail avec le fichier]
    B --> C{Exception ?}
    C -- Oui --> D[Dispose est appelé]
    C -- Non --> D
    D --> E[Fichier fermé à coup sûr]
Schéma : using garantit la fermeture du fichier même en cas d’erreur

6. Exemples pratiques

Imaginons que dans le cadre du cours, on a un mini-programme de gestion de livres. On va ajouter la fonctionnalité d’écriture de nouveaux livres dans un fichier.

Exemple : On sauvegarde un nouveau livre dans un fichier séparé

using System;
using System.IO;

class Program
{
    static void Main()
    {
        Console.WriteLine("Entre le titre du livre :");
        string bookTitle = Console.ReadLine();

        Console.WriteLine("Entre l’auteur :");
        string author = Console.ReadLine();

        string path = "books.txt";
        using (var writer = new StreamWriter(path, append: true))
        {
            writer.WriteLine($"{bookTitle};{author}");
            // Format CSV : chaque ligne = un livre, séparé par un point-virgule
        }

        Console.WriteLine("Livre sauvegardé dans le fichier !");
    }
}

Essaie d’ajouter plusieurs livres à la suite. Dans le fichier books.txt, les lignes vont s’ajouter sans effacer les précédentes. Ce comportement est super pratique pour faire des logs ou des journaux — genre pour ton futur système d’audit quand tu seras un dev Enterprise.

7. Comment éviter les erreurs classiques quand tu écris dans un fichier

La plupart des débutants tombent sur ces galères :

Fichier pas fermé et bloqué par un autre process. La raison — t’as oublié le using.

Tu as écrit plein de lignes, mais le fichier est vide : t’as oublié d’appeler Flush() ou de fermer le flux (avec using c’est automatique).

Tu as écrasé le fichier au lieu d’ajouter — t’as oublié de mettre append: true.

Problèmes d’encodage : le fichier s’ouvre en "charabia" dans le Bloc-notes — mauvais encodage choisi ou l’autre programme ne gère pas UTF-8.

Exceptions UnauthorizedAccessException ou DirectoryNotFoundException : le programme essaie de sauvegarder là où il n’a pas les droits, ou dans un dossier qui n’existe pas. Vérifie le chemin et les droits d’accès.

Erreur "file is used by another process" : tu as ouvert le fichier en écriture mais tu ne l’as pas fermé, ou quelqu’un d’autre essaie d’écrire dessus en même temps.

2
Mission
C# SELF, niveau 36, leçon 3
Bloqué
Écriture et ajout dans un fichier
Écriture et ajout dans un fichier
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION