Récupérer une partie d'un fichier en C++

Résolu/Fermé
Nopidum - 19 mai 2009 à 16:23
 Utilisateur anonyme - 25 mai 2009 à 11:45
Bonjour,
Je suis en galère pour récupérer un morceau de fichier, et l'écrire dans un autre fichier. Dans un premier temps mon code cherche la longueur du fichier source, puis j'essaye d'écrire les 2000 dernières lignes (ouais, ils sont longs mes fichiers sources....) dans un autre fichier. je me heurte à des problèmes de conversion entre mes différents types de pointeurs.....
Please, si quelqu'un à une solution...

voila mon code :

#include <fstream>
#include <vector>
#include <iostream>


using namespace std;

int main() {

fstream fichier("Toto.txt");
vector <string> monTableau;

if ( !fichier )
cout << "fichier inexistant";
else
{
bool continuer = true;

while( !fichier.eof() )
{
monTableau.push_back("");//creation d'une ligne vide

getline(fichier, monTableau.back()); //lecture d'une ligne du fichier

int ligne = monTableau.size() - 1; //je recupere la taille du tableau (-1 pour la ligne 0)

if(monTableau[ligne].empty()) //si la ligne est vide
monTableau.pop_back(); //on la retire du tableau
}

cout << "nombre de lignes : " << monTableau.size() << endl; //j'affiche le nombre de lignes pour test

int debut= monTableau.size()-2000;
int fin= monTableau.size();
int i=0;


const char *fopen("Tata.txt", "r+");

char chaine[1000];

for (i=0;i<fin;i++)
if(i < debut)
return 1;

else
{
fgets(chaine, 1000, fichier);
fputs(chaine, 1000, fichier2);
printf("%s", chaine);

};

}



return 0;
}


Merci d'avance !
A voir également:

5 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
20 mai 2009 à 10:02
Les balises de code ? Je connais pas, je suis vraiment noob, je veux bien que tu m'expliques...
Quand tu écris ton message, juste au dessus, il y a des balises de mise en forme, G, I, S, <>. <> c'est les balise de code, tu clic dessus et tu met ton code entre.

Les erreurs qu'il me renvoie, c'est
-conversion invalide de void* en FILE* dans le fgets
C'est normale, tu mélange C et C++, ou plus précisément fstream et FILE* qui ne sont pas du tout la meme chose.
-erreur d'initialisation de l'argument 3 dans le fgets
Erreur causée par la précedente
-fichier2 non déclaré (je sais pas comment le déclarer, enfin de quel type ?!)
Tu as bien réussi pour fichier, pourquoi pas pour fichier2 ? pour utiliser fputs, il faut utiliser FILE* fichier2;

Merci d'avance, et désolé si mon code est dur à comprendre, mais je programme mal et du coup je fais en 20 lignes ce qu'on peut certainement faire en 5... lourdeur lourdeur quand tu nous tiens...
Le tout c'est d'avoir le raisonnement le plus logique possible. Pense au plus simple et écrit le.
1
Re !

J'ai repensé mon code, ça m'a l'air plus clair, et simplifié je le recolle (entre les balises ce coup ci...)
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

int main() {
	
    fstream fichier("Toto.res");
    fstream fichier2("Tata.res");
    vector <string> monTableau;
    int debut;
    int fin;
    int i;
    char *chaine;

    if ( !fichier )
        cout << "fichier inexistant";
    else
    {
        bool continuer = true;

        while( !fichier.eof() )
        {
            monTableau.push_back("");//creation d'une ligne vide

            getline(fichier, monTableau.back());//lecture d'une ligne du fichier

            int ligne = monTableau.size() - 1;//je recupere la taille du tableau (-1 pour la ligne 0)

        }

	fin = monTableau.size();
	debut = fin-2000;
	
        cout << "nombre de lignes : " << monTableau.size() << endl;//j'affiche le nombre de lignes pour test
	
	for(i=debut;i<fin;i++)
	{  
	chaine=monTableau[i];
	fichier2.write (chaine,1000); 
	}

    }



    return 0;
}

Le problème qui me reste est le suivant :
cannot convert 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char*' in assignment

Je n'arrive pas écrire dans mon fichier de sortie, car j'ai pas du utiliser la bonne commande d'écriture.
autrement dit, je peux pas écrire une ligne de mon vector dans mon fichier2, mais j'arrive pas
non plus à transformer le vector en char. (il me semble que je peux écrire des char avec la commande .write non ?)
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 mai 2009 à 16:48
C'est quoi et où l'erreur exactement.
Ton code est difficile à comprendre. Utilise les balises de code.
0
Les balises de code ? Je connais pas, je suis vraiment noob, je veux bien que tu m'expliques...

Les erreurs qu'il me renvoie, c'est
-conversion invalide de void* en FILE* dans le fgets
-erreur d'initialisation de l'argument 3 dans le fgets
-fichier2 non déclaré (je sais pas comment le déclarer, enfin de quel type ?!)

Merci d'avance, et désolé si mon code est dur à comprendre, mais je programme mal et du coup je fais en 20 lignes ce qu'on peut certainement faire en 5... lourdeur lourdeur quand tu nous tiens...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mai 2009 à 09:03
le problème viens de là non ?
	chaine=monTableau[i];
	fichier2.write (chaine,1000); 
C'est là encore normale, il faut faire attention aux type. String c'est une chaîne de caractère, OK, mais c'est surtout une classe !
alors que chaine est un pointeur. Tu ne peux pas égaler ainsi.
Le plus propre, c'est de déclarer chaine en string et de faire ainsi :
string chaine=monTableau[i];
 fichier2.write(chaine.c_str(),chaine.size()*sizeof(char));
c_str() est une méthode de la classe string qui convertie les classes string en const char*
0
Utilisateur anonyme
25 mai 2009 à 09:27
Merci pour le c_str() je ne connaissais pas ^^, combien de fois j'ai galère à cause de ça !!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mai 2009 à 11:25
Toujours regarder la documentation des classes !
https://en.cppreference.com/w/Main_Page
0
Utilisateur anonyme > Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
25 mai 2009 à 11:45
Thanks =)
0