Récupérer une partie d'un fichier en C++
Résolu
Nopidum
-
Utilisateur anonyme -
Utilisateur anonyme -
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 !
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:
- Récupérer une partie d'un fichier en C++
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
5 réponses
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.
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.
Re !
J'ai repensé mon code, ça m'a l'air plus clair, et simplifié je le recolle (entre les balises ce coup ci...)
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 ?)
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 ?)
C'est quoi et où l'erreur exactement.
Ton code est difficile à comprendre. Utilise les balises de code.
Ton code est difficile à comprendre. Utilise les balises de code.
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...
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
le problème viens de là non ?
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 :
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*