[Résolu]Lecture de fichier qui lit que le premier caractère

Lecture de fichier qui lit que le premier caractère [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 13-05-2006 à 12:50:34    

Bonjour à tous,
 
voila en cours on nous a demandé de faire un petit notepad en C# donc pas de problème pour 95% du projet, mais j'ai un petit problème. Quand je veux ouvrir un fichier, il ne me lit que le premier caractère. J'ai essayé 3 ou 4 méthodes différentes (de mon imagination ou récupérée sur le net) qui sont censées fonctionner sans problème et ca me récupère toujours le premier caractère seulement.
Je vous montre les différents bouts de code.
 

Code :
  1. public byte[] FichierVersTableauDeByte(string CheminFichier)
  2.  {
  3.   System.IO.FileInfo MonFichier = new System.IO.FileInfo(CheminFichier);
  4.   System.IO.FileStream MonFileStream = MonFichier.OpenRead();
  5.   byte[] TableauDeBytes = new byte[MonFileStream.Length];
  6.   MonFileStream.Read(TableauDeBytes, 0, (int)MonFileStream.Length);
  7.   MonFileStream.Close();
  8.   return TableauDeBytes;
  9.  }


 

Code :
  1. TextReader tr = new StreamReader(path);
  2. read = tr.ReadToEnd();
  3. tr.Close();


 

Code :
  1. TextReader tr = new StreamReader(path);
  2. read = "";
  3. temp = tr.ReadLine();
  4. while(temp != null)
  5. {
  6. read += temp;
  7. temp = tr.ReadLine();
  8. }
  9. tr.Close();


 
 
C'est un de mes premiers scripts C#, plus habitué au java/php/C++ , donc j'ai peut etre oublié un truc subtil :)
 
Merci d'avance


Message édité par benamoubeach le 18-05-2006 à 17:18:49
Reply

Marsh Posté le 13-05-2006 à 12:50:34   

Reply

Marsh Posté le 13-05-2006 à 13:14:45    

Code :
  1. string result = String.Empty;
  2. using (TextReader reader = new StreamReader(fileName))
  3. {
  4.     result = reader.ReadToEnd();
  5. }

Reply

Marsh Posté le 13-05-2006 à 13:57:21    

ca fait exactement pareil ... que je l'affiche dans un message.box ou que je le mette dans mon textfield, ca affiche que la premiere lettre..
 
Jme demande si le probleme vient pas de mon utilisation de cette variable parceque la ...

Message cité 1 fois
Message édité par benamoubeach le 13-05-2006 à 13:59:10
Reply

Marsh Posté le 13-05-2006 à 22:16:39    

tu es sure que le prob ne vient pas de la sauvegarde. est tu bien sure que ça écrit bien tout dans ton fichier, tu as vérifié?
 
Sinon tu es obligé de passer par un fichier texte. Sinon tu créer un dataset, tu fou ton texte dans une cellule et tu fais "writeXML" et "ReadXML" pour le relire :D c'est mieux et bcp plus rapide.... :D

Reply

Marsh Posté le 14-05-2006 à 11:39:13    

benamoubeach a écrit :

... que je l'affiche dans un message.box ou que je le mette dans mon textfield, ca affiche que la premiere lettre..


Quel fichier essaie tu de lire? un fichier texte, un fichier binaire?

Reply

Marsh Posté le 14-05-2006 à 11:46:59    

Désolé du retard :)
Alors oui la sauvegarde est bien faite le fichier contient bien la valeur totale de mon textfield, juste j'ai un probleme d'encodage mais je règlerai ce problème apres. Pour répondre a breizhbugs c'est un fichier texte.
Voili voila, si vous voulez voir un bout de code dites le moi :)
 
Pour le dataset, je vais me renseigner :)


Message édité par benamoubeach le 14-05-2006 à 16:08:05
Reply

Marsh Posté le 14-05-2006 à 16:22:54    

pour la dataset c'est tout con
 
Dataset data = new Dataset();
data.Tables.Add("Infos" );
data.Tables["Infos"].Columns.Add("Texte" );
 
DataRow r = data.Tables["Infos"].NewRow();
r["Texte"] = "Bonjour le monde, comment aller vous .... ";
 
data.Tables["Infos"].Rows.add(r);
 
data.writeXml(@"C:\tonfichiertexte.txt" );
 
pour relire
 
data.readXml(@"C:\tonfichiertexte.txt" );
TonTextBox.Text = data.Tables["Infos"].Rows[0]["Texte"].ToString();
 
 

Reply

Marsh Posté le 14-05-2006 à 16:41:17    

ok merci pour le dataset, mais comme il faut sauvegarder en txt comme un notepad classique , je doute que ca puisse me convenir :)

Reply

Marsh Posté le 14-05-2006 à 21:17:32    

oui c'est clair. Le dataset ça te sauvegarde comme un fichier xml...

Reply

Marsh Posté le 15-05-2006 à 07:36:24    

moi23372 a écrit :


Sinon tu es obligé de passer par un fichier texte. Sinon tu créer un dataset, tu fou ton texte dans une cellule et tu fais "writeXML" et "ReadXML" pour le relire :D c'est mieux et bcp plus rapide.... :D


un dataset pour une sauvegarde ? t'as pas plus con à raconter ? et que se passera t'il s'il veut utiliser son notepad sur une machine non équipée de MDAC ? il faudra qu'il le livre avec ? [:mlc]
et s'il veut relire son fichier texte ailleurs, il lira quoi ? du XML ?
et je te parle pas de la mémoire occupée... allez hop ! encore une de ces salades dont tu es coutumier du fait... :pfff:
benamoubeach >> poste le code complet de la méthode qui fait la restauration stp, pas des petits bouts

Message cité 1 fois
Message édité par Harkonnen le 15-05-2006 à 07:37:02

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 07:36:24   

Reply

Marsh Posté le 15-05-2006 à 08:27:54    

Harkonnen a écrit :

un dataset pour une sauvegarde ? t'as pas plus con à raconter ? et que se passera t'il s'il veut utiliser son notepad sur une machine non équipée de MDAC ? il faudra qu'il le livre avec ? [:mlc]
et s'il veut relire son fichier texte ailleurs, il lira quoi ? du XML ?
et je te parle pas de la mémoire occupée... allez hop ! encore une de ces salades dont tu es coutumier du fait... :pfff:
benamoubeach >> poste le code complet de la méthode qui fait la restauration stp, pas des petits bouts


 
Ferme un peu ta gueule... Toujours venir faire ton malin. Le mec il avait besoin d'aide depuis trois jours, alors au lieu de venir faire ta star qui connait tout et qui ta toujours raison, va te faire voir ailleur. C'est pas parce que tu es modérateur que tu peux tout te permettre. Tu as vraiment une salle grande gueule et si je t'avais en face de moi, je t'en collerais une pour que tu l'as boucle. Ton intervention elle sert à rien (comme souvent d'ailleurs).  
 
C'est clair que le dataset est une solution si bien sure ça ne doit pas être lisible par un notepad par exemple, ce qui est logique aussi, et si tu prends le temps de relire ce que j'avais mis plus haut, je l'ai noté aussi. Mais ça bien sure, tu as encore lu en diagonale comme toujours... Allé sans rancune. mais tu commences vraiment à m'énerver car tes interventions elles servent à rien.  

Reply

Marsh Posté le 15-05-2006 à 09:07:15    

moi23372 a écrit :

Tu as vraiment une salle grande gueule et si je t'avais en face de moi, je t'en collerais une pour que tu l'as boucle.


[:ula]
 

moi23372 a écrit :


Ton intervention elle sert à rien (comme souvent d'ailleurs).  


Tiens, j'allais te dire la même chose
 

moi23372 a écrit :


C'est clair que le dataset est une solution si bien sure ça ne doit pas être lisible par un notepad par exemple, ce qui est logique aussi, et si tu prends le temps de relire ce que j'avais mis plus haut, je l'ai noté aussi.


Le dataset n'a rien à foutre là dedans ! Un dataset est associé à une base de données, pas à une sauvegarde. Ce n'est pas du tout pour ça qu'il est prévu.
 
Moi ce que je vois, c'est que que tu n'as pas vu la seule solution vraiment adaptée si le fichier ne devait pas être lisible par un notepad : ça s'appelle la sérialisation/déserialisation. Mais bien évidemment, ton incompétence est telle que ce genre de truc te passe totalement au dessus, c'est bien plus simple de conseiller des solutions à base de bloatware que d'essayer de faire preuve d'un tant soi peu de compétence. Et c'est tellement moins compliqué aussi que d'essayer de corriger le code de benamoubeach, car il y a forcément un truc qui cloche... D'où ma demande pour qu'il poste le code complet de sa fonction, pour éventuellement le tester chez moi... Mais là je t'en demande trop peut etre ?
 

moi23372 a écrit :


Mais ça bien sure, tu as encore lu en diagonale comme toujours... Allé sans rancune. mais tu commences vraiment à m'énerver car tes interventions elles servent à rien.


Je suis pas sur que tous ceux qui fréquentent prog soient de ton avis, j'aurais même tendance à penser que c'est plutot le contraire http://forum-images.hardware.fr/icones/message/icon12.gif


Message édité par Harkonnen le 15-05-2006 à 12:23:03

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 09:42:24    

Et d'ailleurs, puisqu'il semble que je lise les posts de travers, as tu lu ceci :

Citation :


juste j'ai un probleme d'encodage mais je règlerai ce problème apres


c'est quasiment certain que son problème vient de là... il faut creuser du coté de l'encodage utilisé par le StreamReader et par le StreamWriter utilisé pour la sauvegarde. mais ça bien sur, ça t'es passé au dessus


Message édité par Harkonnen le 15-05-2006 à 09:43:06

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 09:49:40    

allez tiens, pour benamoubeach, voici une petite fonction qui te permettra de connaitre l'encodage de ton fichier texte, et de déclarer le StreamReader en conséquence :

Code :
  1. StreamReader sr = new StreamReader("tonfichier.txt", true);
  2. Encoding enc = sr.CurrentEncoding;
  3. Console.WriteLine("Encodage utilisé : {0}", enc);
  4. Console.WriteLine();


une fois que tu as l'encodage correct, tu n'as plus qu'à le spécifier dans le constructeur de ton StreamReader de lecture


Message édité par Harkonnen le 15-05-2006 à 09:57:34

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 10:41:00    

et je terminerais avec ce magnifique post de moi23372 qui nous fait profiter de ses arguments béton et de son immense compétence en SGBD, sans doute tirée de sa non moins immense compétence à l'époque du post (étudiant)
 
http://forum.hardware.fr/hardwaref [...] tm#t978571
 
je recommande la lecture entière de ce topic, si vous êtes en manque de bidonnage, surtout le post un peu plus bas, ou ce charmant jeune homme me dit que je n'y connais rien alors que je suis admin Oracle...

Message cité 1 fois
Message édité par Harkonnen le 15-05-2006 à 10:43:20

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 11:50:13    

Oula faut pas vous engueuler les mecs :) enfin merci pour le bout de code Harkonnen
 
voila ma fonction de sauvegarde du fichier
 

Code :
  1. private void SaveFile(string path)
  2. {
  3.   try
  4.   {
  5.    File.Delete(path);
  6.    FileStream fs = File.OpenWrite(path);
  7.    byte[] info = ConvertStringToByteArray(textField.Text);
  8.    fs.Write(info,0,info.Length);
  9.    fs.Close();
  10.    path_to_file = path;
  11.    isModified = false;
  12.    Text = Path.GetFileName(path_to_file)+" - CSEdit";
  13.   }
  14.   catch(Exception e)
  15.   {
  16.    // gerer ici l'exception
  17.   }
  18. }


 
Et pour l'ouverture de fichier ben j'a idéja posté les différents codes plus haut. En fait je me sers pas de StreamWriter pour écrire dans le fichier, donc je vais changer pour voir ce que ca donne avec ca pour l'encodage :) merci
 
 
Edit: donc le problème vient bien de l'encodage à la sauvegarde car avec d'autres fichiers, cela fonctionne parfaitement.

Message cité 1 fois
Message édité par benamoubeach le 15-05-2006 à 12:03:24
Reply

Marsh Posté le 15-05-2006 à 12:04:56    

benamoubeach a écrit :

En fait je me sers pas de StreamWriter pour écrire dans le fichier, donc je vais changer pour voir ce que ca donne avec ca pour l'encodage :) merci


et bien tu devrais, car StreamWriter est prévu exactement pour la sortie de fichiers texte en te permettant d'indiquer l'encodage utilisé (UTF-8 par défaut). utilise le "tel quel" (sans spécifier l'encodage), et ça devrait marcher sans souci ;)


Message édité par Harkonnen le 15-05-2006 à 12:05:08

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 12:20:13    

donc voila le nouveau code, je l'ai utilisé sans encodage(je l'ai affiché , c'est bien de l'utf-8) et ca n'encode toujours pas bien les retours chariots / tabulations.
 

Code :
  1. File.Delete(path);
  2.    TextWriter sw = new StreamWriter(path);
  3.    sw.Write(textField.Text);
  4.    sw.Close();


 
c'est chiant ces encodages :p

Reply

Marsh Posté le 15-05-2006 à 12:23:45    

je teste après bouffer


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 12:25:03    

ok merci ;) pendant ce temps jvais chercher du coté des classe UTF8Encoding et tout ce qui ressemble

Reply

Marsh Posté le 15-05-2006 à 13:10:34    

j'ai testé et tout marche nickel avec le code que tu as filé (sous VS 2005).
j'ai une form, avec un TextBox multiline et 2 boutons : un bouton pour restaurer et un autre pour sauvegarder. voici le code du bouton pour lire :

Code :
  1. private void buttonLoad_Click(object sender, EventArgs e)
  2.        {
  3.            TextReader tr = new StreamReader(@"c:\test.txt" ); // nom de mon fichier texte
  4.            string read = tr.ReadToEnd();
  5.            tr.Close();
  6.            textBox1.Text = read;
  7.        }


 
et celui pour sauver :

Code :
  1. private void buttonSave_Click(object sender, EventArgs e)
  2.        {
  3.            TextWriter sw = new StreamWriter(@"c:\test.txt" );
  4.            sw.Write(textBox1.Text);
  5.            sw.Close();
  6.            textBox1.Clear(); // on efface le textbox une fois que tout est sauvegardé
  7.        }


tout marche nickel, même les accents passent, et sans spécifier aucun encoding :spamafote:


Message édité par Harkonnen le 15-05-2006 à 13:18:12

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 13:32:52    

moi23372 a écrit :

Ferme un peu ta gueule... Toujours venir faire ton malin. Le mec il avait besoin d'aide depuis trois jours, alors au lieu de venir faire ta star qui connait tout et qui ta toujours raison, va te faire voir ailleur. C'est pas parce que tu es modérateur que tu peux tout te permettre. Tu as vraiment une salle grande gueule et si je t'avais en face de moi, je t'en collerais une pour que tu l'as boucle. Ton intervention elle sert à rien (comme souvent d'ailleurs).  
 
C'est clair que le dataset est une solution si bien sure ça ne doit pas être lisible par un notepad par exemple, ce qui est logique aussi, et si tu prends le temps de relire ce que j'avais mis plus haut, je l'ai noté aussi. Mais ça bien sure, tu as encore lu en diagonale comme toujours... Allé sans rancune. mais tu commences vraiment à m'énerver car tes interventions elles servent à rien.


J'irais faire quelques achats sur amazon à ta place.
http://www.amazon.fr/exec/obidos/s [...] 28-0300265
http://www.amazon.fr/exec/obidos/A [...] 28-0300265

Reply

Marsh Posté le 15-05-2006 à 13:43:28    

Moi les accents ya pas de problème mais les tab / retour chariots ca les encode mal . Pourtant je fais pareil que toi ...

Reply

Marsh Posté le 15-05-2006 à 13:45:21    

ah ben j'ai pas testé les tab. attends je vérifie de suite


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 13:49:34    

ben ça marche aussi :spamafote:
c'est quoi le controle que tu utilises pour écrire ? un TextBox multiline ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 13:51:54    

c'est une RichTextBox, c'est ce que mon prof m'a dit d'utiliser

Reply

Marsh Posté le 15-05-2006 à 13:54:01    

je vérifie avec un RTB, bouge pas


Message édité par Harkonnen le 15-05-2006 à 13:54:17

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 13:59:24    

ça marche aussi [:mlc]
ce que tu peux faire : éditer ton fichier texte avec un éditeur hexa pour voir la gueule des retour chariots. chez moi, ils sont encodés comme ceci :  
0A 00


Message édité par Harkonnen le 15-05-2006 à 14:00:14

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 14:00:10    

gniii ok jvais voir , jte dis ca tout de suite

Reply

Marsh Posté le 15-05-2006 à 14:03:22    

Tab : 00 09
Retours chariots : 00 0A
 
jvais me jeter d'un ravin, je reviens

Reply

Marsh Posté le 15-05-2006 à 14:08:42    

mais tu as quoi comme symptome pour dire qu'ils sont mal encodés :??:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 14:10:06    

ca m'affiche des carrés dans notepad a la place de ce que ca devrait afficher normalement

Reply

Marsh Posté le 15-05-2006 à 14:13:47    

je viens de regarder un autre fichier qui s'affiche correctement sur notepad et sur mon editeur, et les retours chariots ont pour valeur hexa 0D 0A

Reply

Marsh Posté le 15-05-2006 à 14:47:54    

mouais, je viens de tester et c'est bien un problème d'encoding.... sous notepad, les retours chariots sont bien représentés par des carrés, et sous wordpad, les retours chariots passent bien, mais ce sont les accents qui déconnent :/
essaie de spécifier un autre encodage, du genre iso-8859-1 par exemple. là je peux pas le faire de suite, teste le, et je testerais chez moi de mon coté ce soir


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 17:37:13    

bon, test réalisé. dans le constructeur de StreamReader et StreamWriter, spécifie l'encoding par défaut (Encoding.Default).
par contre : reste toujours ces fameux retours chariots. sous Wordpad, le fichier créé se lit nickel avec l'encoding par défaut. sous Notepad, j'ai des carrés à la place des retours chariots :/
en fait, Notepad lit en ANSI par défaut, et donc les retours chariots sont codés comme 0D 0A, alors que Encoding.Default encode les retours chariots comme 0A. donc soit tu fous Wordpad comme lecteur par défaut pour tes fichiers texte, soit tu trouves le moyen de coder les retours chariots en ANSI. d'après la doc, Encoding.Default représente pourtant l'encodage Windows ANSI, donc je comprends pas :/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 18:45:28    

Et moi qui croyait que mon problème était un truc tout simple à résoudre ouin ouin

Reply

Marsh Posté le 15-05-2006 à 19:19:03    

J'ai tenté vaguement d'encoder ma chaine mais j'ai un peu de mal avec toutes les classes différentes qu'il y a, j'ai fait un truc du style :
 

Code :
  1. byte[] data = System.Text.Encoding.UTF8.GetBytes(textField.Text);


 
mais ca ne fonctionne toujours pas

Reply

Marsh Posté le 15-05-2006 à 19:36:55    

non non, n'encode pas en UTF8. vu que ton notepad est destiné à une utilisation en local, utilise plutot l'encoding par défaut. je suis certain qu'il y a un truc très con pour résoudre ce problème, faut juste mettre le doigt dessus. je vais voir ce que je peux trouver, parce que ça m'intéresse aussi, les pbs d'encoding m'ont pas mal pollué la vie également :D
 

Spoiler :

sinon tu fous tous tes caractères dans un dataset, et tu encodes colonne par colonne en XML qui va bien [:kbchris]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 19:45:21    

ah et je tiens à signaler que malgré sa flagrante grossièreté, je n'ai pas du tout banni l'ami moi23372, qui est libre de venir ici pour apporter un droit de réponse [:aloy]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-05-2006 à 20:09:07    

Ouais j'ai copié le UTF8 mais j'avais essayé avec plusieurs type d'encodage , juste copié la mauvaise ligne :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed