Teste de informatică pentru liceu, articole C#, C/C++, PHP
În C# fişierele text sunt gestionate, ca şi în C++, prin stream-uri (fluxuri de date structurate pe octeţi). Pentru lucrul cu fişiere text trebuie să utilizaţi spaţiul de nume System.IO, deci veţi include în antetul programului linia:
using System.IO;
Cele două clase pe care le vom utiliza sunt StreamReader (pentru citirea datelor din fişier) şi StreamWriter (pentru scrierea datelor în fişier).
P1. În fişierul c:\test\date.txt pe prima linie se găsesc mai multe cuvinte formate din litere. Aceste cuvinte sunt separate prin spaţii. Să se afişeze cuvintele în fişierul date.out, fiecare cuvânt pe câte o linie.
Dacă nu este specificată o cale completă către fişier ci doar numele fişierului, atunci date.txt trebuie să se afle în acelaşi folder cu executabilul. Acest folder este de regulă bin\release. Mai jos este programul complet.
using System;
using System.IO;
namespace Fisiere
{
class Program
{
static void Main(string[] args)
{
// citire din fisier
StreamReader fin = new StreamReader("c:\\test\\date.txt");
string linie = fin.ReadLine();
fin.Close();
// separare in cuvinte
char[] separator = { ' ' };
string[] cuvinte = linie.Split(separator, StringSplitOptions.RemoveEmptyEntries);
// tiparirea cuvintelor
StreamWriter fout = new StreamWriter("c:\\test\\date.out");
foreach (string cuv in cuvinte)
fout.WriteLine(cuv);
fout.Close();
}
}
}
De menţionat că fişierul de intrare trebuie să existe şi să nu fie vid! Fişierul de ieşire este creat automat, iar dacă există este suprascris. Dacă fişierul nu există atunci programul furnizează una din aşa-numitele excepţii. Mai multe despre excepţii vom discuta într-o lecţie ulterioară. Există însă o modalitate simplă pentru a verifica dacă un fişier există la o anumită locaţie. Acest lucru se face cu funcţia statică Exists din clasa File. Este returnează valoarea true dacă fişierul există sau valoarea false în caz contrar. Iată codul mai jos.
if (File.Exists("c:\\test\\date.txt"))
{
// citire din fisierul date.txt,
// scriere in fisierul de iesire
}
else
Console.WriteLine("Fisier de intrare inexistent!");
P2. În folderul c:\test se află mai multe fişiere. Se cere să se scrie în fisierul c:\test\lista.txt numele fişierelor din acest folder care au extensia .in.
StreamWriter f = new StreamWriter("c:\\test\\lista.txt");
string[] numeFisiere = Directory.GetFiles("c:\\test", "*.in");
foreach (string s in numeFisiere)
f.WriteLine(s);
f.Close();
Folosind funcţia GetFiles din clasa Directory se preiau automat fişierele din folderul c:\test care au extensia ".in". Pattern-ul de căutare, "*.in" este binecunoscut.
P3. În fişierul numere.txt se află mai multe numere naturale, dispuse pe mai multe linii. Să se afişeze în fişierul rez.txt suma lor.
int suma = 0;
string linie;
char[] sep = {' '};
StreamReader f = new StreamReader("c:\\test\\numere.txt");
while ((linie = f.ReadLine()) != null)
{
string[] numere = linie.Split(sep, StringSplitOptions.RemoveEmptyEntries);
foreach (string x in numere)
suma += int.Parse(x);
}
Console.WriteLine(suma);
f.Close();
Observaţi modul în care se citesc mai multe linii dintr-un fişier dacă nu se cunoaşte dinainte numărul acestora. Este cumva asemănător cu modul de citire cu stream-uri din C++:
while (f >> linie) ...
Probleme propuse
P4. Se citeşte un număr natural n. Să se scrie în fişierul patrate.in toate pătratele numerelor naturale cuprinse între 1 şi n.
P5. Fişierele unu.txt şi doi.txt conţin pe mai multe linii câte un cuvânt. Să se concateneze conţinutul celor două fişiere în fişierul trei.txt.
P6. Fişierul date.in conţine mai multe numere pe mai multe linii. Să se ordoneze crescător şirul de numere şi să se tipărească în fişierul date.out.
Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică
Adina 25-12-2014 15:56:8
Buna ziua as avea si eu o problema daca ma puteti ajuta la ea este foarte important.
Se da un fisier text care contine pe prima linie un numar n de angajati, iar pe urmatoarele lini informatii ale acestora sub forma:Nume Departament si Data angajari. Sa se creze o colectie cu aceste date si sa se afiseze intr-un fisier de ierire, lista alfabetica a departamentelor, iar pentru fiecare departament lista alfabetica a angajatilor impreuna cu data angajari corespunzatoare.
Va multumesc