Question

J'ai un fichier texte ressemble à ceci:

100 50 20 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627 ....

Je dois modifier ce fichier afin que tout soit conservé le même, sauf la première ligne, 3ème point. Le ouput devrait ressembler à ceci:

100 50 19 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627
....

Comment puis-je faire en c ++? Quelqu'un peut-il me aider?

Merci, Hoang

Était-ce utile?

La solution

#include <stdio.h>

int main()
{
      FILE *pFile;
      pFile = fopen("example.txt", "r+");
      fseek(pFile, 7, SEEK_SET);
      fputs("19", pFile);
      fclose(pFile);
      return 0;
}

Modifier Ce qui précède était bien sûr la plupart du temps une blague. La vraie façon de le faire est de lire la première ligne, le diviser en plusieurs parties, modifier le nombre requis, l'écrire, puis suivre avec tout le reste des lignes. Si nous savons que le fichier contient quatre entiers (? Flotteurs) sur la première ligne, quelque chose comme cela pourrait suffire:

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
    ifstream in("in.txt");
    ofstream out("out.txt");
    float v1, v2, v3, v4;
    in >> v1 >> v2 >> v3 >> v4;
    v3 = 19.1234; // <- Do whatever you need to here.
    out << v1 << " " << v2 << " " << v3 << " " << v4;
    out << in.rdbuf();
    out.close();
    in.close();
    return 0;
}

Autres conseils

Tant le résultat est la même longueur que l'original (ou moins, et ne vous dérange pas d'ajouter des espaces pour couvrir la différence), il est assez facile: chercher à l'endroit où vous voulez faire la modification, écrire les nouvelles données, et vous avez terminé:

#include <fstream>
#include <ios>

int main() { 
    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    file.seekp(7);
    file << "19";
    return 0;
}

Si les données que vous voulez écrire ne sera pas « apte » entre autres choses que vous voulez conserver, vous devez ré-écrire le reste du fichier, la copie généralement de l'ancien fichier à un autre, modifier la données nécessaires sur le chemin à travers.

Edit: quelque chose comme ceci:

#include <fstream>
#include <ios>
#include <iterator>
#include <vector>

int main() { 
    std::vector<double> data;

    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    std::copy(std::istream_iterator<double>(file), 
        std::istream_iterator<double>(),
        std::back_inserter(data));
    file.clear();
    file.seekp(0);
    data[2] = 19.98;
    std::copy(data.begin(), data.end(), std::ostream_iterator<double>(file, " "));
    return 0;
}

Il a quelques effets que vous ne voulez pas - en particulier, tel qu'il est, il détruit tout « ligne » structure orientée l'avait peut-être d'origine, et écrit simplement le résultat comme une longue ligne. Si vous voulez éviter cela, vous pouvez (par exemple) lire en ligne à un moment, convertir les nombres dans la ligne (par exemple, mettre ensuite dans un stringstream, puis les lire de là aussi double), modifier ceux-ci, mettre le résultat dans une chaîne, et d'écrire sur la ligne avec un « \ n » à la fin.

Vous pouvez utiliser un std :: wfstream.

#include <fstream>

using namespace std;
int main() {
    wfstream file(L"example.txt", std::ios::in | std::ios::out);
    std::wstring first, second, third; // The extraction operator stops on whitespace
    file >> first >> second >> third;
    third = L"Whatever I really, really, want!";
    file << first << second << third;
    file.flush(); // Commit to OS buffers or HDD right away.
}

J'ai probablement foiré l'utilisation de l'opérateur d'insertion. Mais, vous pouvez faire référence à MSDN pour les exactitudes de l'utilisation du wfstream. Je serais absolument déconseillé d'utiliser toute solution C, toutes les fonctions de manipulation de chaîne sucent vraiment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top