web-dev-qa-db-fra.com

Comment copier un fichier .txt dans un tableau de caractères en c ++

J'essaie de copier un fichier .txt entier dans un tableau de caractères. Mon code fonctionne mais il laisse de côté les espaces blancs. Ainsi, par exemple, si mon fichier .txt se lit "I Like Pie" et que je le copie dans myArray, si je compte mon tableau en utilisant une boucle for, je reçois "ILikePie".

Voici mon code

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

int main () 
{
  int arraysize = 100000;
  char myArray[arraysize];
  char current_char;
  int num_characters = 0;
  int i = 0;

  ifstream myfile ("FileReadExample.cpp");

     if (myfile.is_open())
        {
          while ( !myfile.eof())
          {
                myfile >> myArray[i];
                i++;
                num_characters ++;
          }      

 for (int i = 0; i <= num_characters; i++)
      {

         cout << myArray[i];
      } 

      system("pause");
    }

aucune suggestion? : /

11
user2710184

Avec

myfile >> myArray[i]; 

vous lisez le fichier Word par Word, ce qui provoque le saut des espaces.

Vous pouvez lire le fichier entier dans la chaîne avec

std::ifstream in("FileReadExample.cpp");
std::string contents((std::istreambuf_iterator<char>(in)), 
    std::istreambuf_iterator<char>());

Et ensuite, vous pouvez utiliser contents.c_str() pour obtenir un tableau de caractères.

Comment ça marche

std::string a un constructeur de plage qui copie la séquence de caractères de la plage [premier, dernier) remarquez qu'il ne copie pas le dernier , dans le même ordre:

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

std::istreambuf_iterator iterator est un itérateur en entrée qui lit les éléments successifs d'un tampon de flux. 

std::istreambuf_iterator<char>(in)

créera un itérateur pour notre ifstream in (début du fichier), et si vous ne transmettez aucun paramètre au constructeur, il créera un itérateur de fin de flux (dernière position):

Std :: istreambuf_iterator, construit par défaut, est appelé itérateur de fin de flux. Lorsqu'un std :: istreambuf_iterator valide atteint la fin du flux sous-jacent, il devient égal à l'itérateur de fin de flux. Le déréférencement ou l'incrémentation appelle en outre un comportement indéfini.

Ainsi, cela va copier tous les caractères, en commençant par le premier dans le fichier, jusqu'à ce que le prochain caractère soit la fin du flux.

32
Nemanja Boric

Utilisez l'extrait de code suivant:

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);

char *string = (char *)malloc(fsize + 1);
fread(string, fsize, 1, f);
fclose(f);

string[fsize] = 0;
9
Didac Perez Parera

Une solution simple si vous devez utiliser des tableaux de caractères et une modification minimale de votre code. L'extrait ci-dessous inclura tous les espaces et les sauts de ligne jusqu'à la fin du fichier.

      while (!myfile.eof())
      {
            myfile.get(myArray[i]);
            i++;
            num_characters ++;
      }  
1
HyperionX

Une approche beaucoup plus simple consisterait à utiliser la fonction membre get ():

while(!myfile.eof() && i < arraysize)
{
    myfile.get(array[i]); //reading single character from file to array
    i++;
}
1
Theja