Retour chariot sur dernière ligne d'un fichier [Résolu]

Signaler
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008
-
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
-
bonjour,
j'ai déclaré une variable FicCsvResultOptim de type text
j'utilise les méthode 
  AssignFile(FicCsvResultOptim, nomFichierRecuit);
  reset(FicCsvResultOptim);




   j'aimerai me positionner sur la dernière ligne du fichier et ajouter si besoin est un retour chariot sur cette ligne.

Comment faire?

merci pour votre aide.

emmanuel

12 réponses

Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
28 mai 2020
29
oui effectivement la StringList ajoute automatiquement
un retour chariot au moment de la sauvegarde

je ne le savais même pas !!!
je viens de découvrir la chose ... Alors Bug ou pas Bug

Enfin toujours est il ... tu corriges comme suit et ça fonctionne (j'ai testé cette fois  )

procedure TfrmMain.Button1Click(Sender: TObject);
Var  SL : TStringList;
        Txt : String;
Begin
  {On crée la StringList}
  SL := TStringList.Create;
  With SL do Try
    {On charge le texte depuis le fichier}
    LoadFromFile('Nom_Du_Fichier_Texte.txt');
    {Récupère la dernièrre ligne dans Txt}
    Txt : = Strings[Count - 1];
    {Ajoute une ligne Vide à la fin du Fichier si elle n'éxiste pas}
    If Txt <> EmptyStr Then
      SaveToFile('Nom_Du_Fichier_Texte.txt');
  Finally
   {Ne jamais oublier de liberer}
    Free;
  End;
End;

 
@+
Cirec

Messages postés
306
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
10 mai 2017
2
Alors pour ce qui est du retout chario, c'est comme pour ecrire sauf que tu met une chaine vide.
Pour ça faut déclarer un string et faire :
   machaine='';
   writeln (monfichier, mastring);

Pour aller à la fin du fichier je ne sais pas.. Je sais comment savoir si on est à la  fin (avec eof) mais c'est tout.

Vala ^^

BIz [;)]
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
28 mai 2020
29
Salut,

pourquoi ne pas utiliser un TStringList ?

Ex:
procedure TfrmMain.Button1Click(Sender: TObject);
Var  SL : TStringList;
        Txt : String;
Begin
  {On crée la StringList}
  SL := TStringList.Create;
  With SL do Try
    {On charge le texte depuis le fichier}
    LoadFromFile('Nom_Du_Fichier_Texte.txt');
    {Récupère la dernièrre ligne dans Txt}
    Txt : = Strings[Count - 1];
    {Ajoute une ligne Vide à la fin du Fichier si elle n'éxiste pas}
    If Txt <> EmptyStr Then Begin
      Add('');
      {Il faut sauvegarder les modifications}
      SaveToFile('Nom_Du_Fichier_Texte.txt');
    End;
  Finally
   {Ne jamais oublier de liberer}
    Free;
  End;
End;

 
@+
Cirec

Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
 bj ndsaerith

Pour aller en fin de fichier texte : SeekEof(F);
Les instruction de fichiers sont accompagnées d'exemple en général : => F1
Pour ajouter un retour ligne, tu peux ajouter le code ascii #13#e d'une ligne10 (ou chr(13)+chr(10)); // retour ligne + descente d'1 ligne

A+
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
Cirec a été plus rapide
avec toujours de bonnes idées
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008

De temps en temps, le fichier que je dois traiter est de la sorte :
La dernière ligne n'a pas de retour chariot.
Avec le code de cirec, que j'ai testé, dans tous les cas, il me rajoute une ligne blanche.

 #Creation date;
02/01/2007 15:28:26;
#Optimization mode (Stack=1 ou Coil=2);
2;
#Annealing number;Annealing Code;Base type;
J2c164t104;104dssc;bremen_1_4;
#Ordered list of the coils in the stack
#number of coils;
2;
#Coil number;Weight(Kg);External Diameter(mm);Width(mm);Thickness(mm);Annealing Code;
724738x000; 33680;1845;1807;0.910;104dssc;
724769x000; 33660;1766;19970;0.840;104dssc;
#Number of measurement points;
0;
#Ordered list of the measurement points;
#Time(s);Regulation sensor T°(°C);Safety sensor T° (°C);Fuel gas flow(Nm3/h);Air flow(Nm3/h);
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
Salut,


J'avais fait ce code qui ressemble fort à la méthode à Cirec, si ça peut résoudre :

procedure TForm1.Button1Click(Sender: TObject);

const nomFichierRecuit = 'Essai.txt';

var

  List: TStrings;

begin

  List := TStringList.Create;

  with List do

  try

    LoadFromFile(nomFichierRecuit);

    List[Count -1] := List[Count -1] + #13#10;

    SaveToFile(nomFichierRecuit);

  finally

    Free;

  end;

end;


Ca va mieux comme ça ?


Bonne prog'


japee
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008

avec ton code, cela me rajoute systématiquement une ligne blanche que j'ai un retour chariot ou non dans le fichier.
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
28 mai 2020
29
Argh...
j'avais pas actualisé la page avant de poster

@Japee  Normalement ta méthode ajoute à tous les coups deux retours chariot si il n'y en a pas en fin de fichier
et un dans le cas contraire.

En fait les deux lignes suivantes ne sont pas néscéssaires :
    Txt := Strings[Count - 1];
    If Txt <> EmptyStr Then

Mais ça évite de faire un Save directement après un Load
et surtout de ne pas sauvegarder si ce n'est pas utile

@ Furax13 :
Avec le dernier code ?
Avec le premier je suis d'accord mais pas le deuxième,
Je viens de faire les testes et ça fonctionne très bien chez moi !!!

 
@+
Cirec

<hr size ="2" />
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008

nos différentes réponses se sont téléscopées.
En effet, le code suivant fonctionne parfaitement et répond à mon besoin

Merci pour votre aide

procedure TfrmMain.Button1Click(Sender: TObject);
Var  SL : TStringList;
        Txt : String;
Begin
  {On crée la StringList}
  SL := TStringList.Create;
  With SL do Try
    {On charge le texte depuis le fichier}
    LoadFromFile('Nom_Du_Fichier_Texte.txt');
    {Récupère la dernièrre ligne dans Txt}
    Txt : = Strings[Count - 1];
    {Ajoute une ligne Vide à la fin du Fichier si elle n'éxiste pas}
    If Txt <> EmptyStr Then
      SaveToFile('Nom_Du_Fichier_Texte.txt');
  Finally
   {Ne jamais oublier de liberer}
    Free;
  End;
End;
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
28 mai 2020
29
Je me disais bien ...

Pourrais tu cliquer sur Réponse Accèptée  (à coté de la bonne réponse)
s'il te plait ... Merci

 
@+
Cirec

Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
28
moi j'en ai une autre :

comme ça on peu meme le faire sur des fichiers de plusieurs Mo...

var
  vFS : TFileStream;
  vEO : word;
const
  cEO : word = $0A0D;
begin
   vFS := TFileStream.Create(FileName, fmOpenReadWrite);
   try 
     vFS.Position := vFS.Size-3;
     vFS.ReadBuffer(vEO,2);
     if vEO <> cEO then begin
        vEO := cEO;
        vFS.WriteBuffer(vEO,2);
     end;      
   finally
     vFS.Free;
   end;
end;