c ++ comment lire un fichier dans un tableau


Réponse 1:

C ++ utilise les E / S standard C pour accéder aux fichiers. Le code C fonctionnera donc très bien.

C ++ a de jolis objets iostream qui font un tas de trucs sympas de cette façon.

Il est utile de connaître le format du fichier. Lisez-vous des nombres séparés par des virgules, séparés par des espaces ou un par ligne?

Vous avez raison de dire que ce ne sont pas des nombres, mais du texte numérique. Vous devrez convertir le texte en nombres après leur lecture. Ne sachant pas quel type de numéros, utilisez le double pour couvrir tous les paris.

La réponse de Michael Bauers est bonne, mais manque d'explications.

ouvrir le fichier lire le texte convertir le texte en nombre ajouter au conteneur. Fermer le fichier

ma prise:

créer un opérateur pour alimenter les nombres d'un fichier dans un vecteur.

créer le numéro vecteur ouvrir le fichier appliquer l'opérateur pour remplir le vecteur fermer le fichier utiliser le vecteur

// créer un opérateur >> pour travailler avec vector et istream std :: istream & opérateur >> (std :: istream & in, std :: vector & v){ double d; while (in >> d) // ifstream fait du texte-> double conversionv.push_back (d); // ajouter au vecteur retour en; // renvoie le flux lui-même} // crée un vecteur pour contenir des doublesstd :: vecteur mynumbers;std :: ifstream inputFile {"fichier.txt"}; // {} est la syntaxe de la 'liste d'initialisation' while (inputFile)inputFile >> mynumbers; // entrez tous les nombres jusqu'à ce que vous ayez terminéinputFile.close (); // ferme le fichier// maintenant le vecteur est chargé, le fichier est fermé - prêt.

La boucle de lecture est dans la fonction operator >>, donc la syntaxe est laconique mais très lisible. Tout va mal (fichier non trouvé, pas de données ..) et l'ifstream se nettoie et génère une exception d'échec que vous pouvez attraper ou laisser le programme mourir.


Réponse 2:

Question: Comment puis-je lire des nombres dans un fichier texte dans un tableau en C ++?

Wow 3 demandes de réponse de 3 personnes différentes sur cette même question. Étrange! Cela semble presque être quelque chose que quelqu'un aurait pu rechercher sur Google pour déterminer la réponse au lieu de demander également sur Quora. Je n'ai pas besoin de google - je peux écrire le code de mémoire et de mon esprit:

#comprendre #comprendre #comprendre en utilisant l'espace de noms std;int main (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);vecteur lstNumbers; while ((! in.eof ()) && in) { int iNumber = 0; dans >> iNumber; lstNumbers.push_back (iNumber); } joindre(); // Que souhaitez-vous faire de ces chiffres ???}

Ok, j'ai menti - j'ai dû chercher sur Google la référence C ++ pour la classe vectorielle parce que honnêtement, je ne l'utilise jamais. Je travaille avec le framework QT qui a ses propres classes pour toutes les structures de données (liste, carte, ensemble, etc.). De plus, je ne travaille normalement pas avec les E / S de fichiers - je travaille principalement en Java de manière professionnelle et même là, je ne travaille pas avec des fichiers, sauf des fichiers JSON et XML et pour ceux-ci, il existe des bibliothèques qui résument des choses pour le programmeur donc on n'a pas à se soucier d'ouvrir, de fermer ou de lire des éléments du fichier. Mais cela devrait faire l'affaire pour vous, je crois.

Je n'ai pas testé cela - juste pour être clair - Un changement que je pourrais faire est d'envelopper le code de fichier dans un bloc try / catch, mais comme C ++ est moins anal sur les exceptions que Java, je ne l'ai pas fait ici. Le try / catch empêcherait les erreurs embêtantes d'apparaître même lors de l'ouverture ou de la fermeture du fichier - contenant l'erreur pour ainsi dire.


Réponse 3:

Quelque chose comme ça.

En général, je n'aime pas le style de lecture des ints directement à partir d'un fichier. J'ai tendance à lire ligne à la fois, puis à analyser la ligne. J'avoue que je ne suis jamais sûr à 100% du comportement de lecture directe des nombres, comme ce qui se passe s'il y a des éléments intermédiaires qui ne sont pas des nombres.

À moins que ce ne soit un projet exigeant des tableaux, j'utiliserais un vecteur. Les tableaux ne se redimensionnent pas, et écrire des programmes avec des tampons fixes est une erreur, et je peux le prouver en vous racontant toutes les fois où je me suis brûlé en pensant avoir rendu la taille maximale suffisamment grande (je ne le ferai pas, mais il y a eu des moments .)

#comprendre #comprendre #comprendre #comprendre en utilisant l'espace de noms std;int main() { ifstream monfichier ("d: \\ nombres.txt"); if (monfichier.is_open ()) { int arrSize = 0;tableau arr; // Idéalement, ce serait un vecteur, mais vous avez dit tableau tandis que (vrai) { int x; monfichier >> x; if (monfichier.eof ()) Pause; arr [arrSize ++] = x; } pour (int i = 0; i cout << arr [i] << ""; cout << endl; // J'aurais dû fermer le fichier ici, mais comme le programme se terminait, j'étais paresseux} autre { cout << "Impossible d'ouvrir le fichier"; } return 0;}

Réponse 4:

Si vous êtes certain que le fichier ne contient que les nombres que vous voulez lire, et que vous êtes assez sensé pour traiter le «tableau» comme un concept abstrait, plutôt que de faire référence spécifiquement au tableau que C ++ a hérité de C, alors il peut être assez raisonnable pour initialiser un vecteur (ou vecteur , etc.) à partir d'un fichier quelque chose comme ceci:

entrée std :: ifstream ("nombres.txt");std :: vecteur nombres {std :: istream_iterator (contribution), {}};

(pour «T» = quel que soit le type que vous voulez lire - int, double, float, etc.)

Si votre fichier peut contenir des «indésirables» supplémentaires entre les nombres, vous pouvez toujours faire la même chose si vous le souhaitez. Un istream_iterator est essentiellement un adaptateur qui utilise l'opérateur >> pour lire les éléments du flux. Cela, à son tour, ignore les espaces, donc quelque chose comme `1 2` sera lu comme 1 suivi de 2.

Mais voici l'un des endroits où iostreams est en fait assez décemment conçu: l'iostream ne détermine pas (lui-même) ce qu'est un espace blanc. Au lieu de cela, il délègue cela aux paramètres régionaux du flux.

Si nous voulons ignorer les indésirables supplémentaires dans le flux (par exemple, tout ce qui n'est pas un chiffre), nous pouvons définir une locale qui dit que tout le reste est un espace, alors lisez simplement nos nombres à partir du flux.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} static std :: ctype_base :: mask const * get_table () { // tout d'abord, créez un tableau qui dit que tout est un espace blanc: statique std :: vector rc (std :: ctype :: taille_table, std :: ctype_base :: space); // puis définissez les chiffres comme étant réellement des chiffres: if (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // retourne le tableau pour classer les caractères en conséquence: retourne & rc [0]; }};

Nous disons ensuite au flux d'utiliser cette locale et lisons les données du flux:

int main() { std :: istringstream input (R "(11 junk 1.00 more-junk 16.0 encore plus indésirable 1.999! @ # $$% ^ $% & * enfin fait)"); input.imbue (std :: locale (std :: locale (), new digits_only));std :: vecteur nombres {std :: istream_iterator (contribution), {}};}

Et, puisque la locale dit que tout sauf un chiffre est un espace blanc, tout le «truc» supplémentaire entre les nombres sera traité comme un espace blanc (c'est-à-dire ignoré en silence) donc nous obtenons juste les nombres.


Réponse 5:

Vous pouvez lire les nombres dans un fichier txt à l'aide du code suivant.

#comprendre

#comprendre

#comprendre

void main ()

{char ch; int a; int arr [[30]; int i = 0;

ifstream f1 («abc.txt»);

tandis que (! f1.eof ())

{

fi >> ch;

a = static_cast ch;

arr [i] = a;

}

f1.close ();

getch ();

}

Ce programme lit un fichier texte qui est supposé être déjà créé avant ce programme, car le fichier est au format txt, nous allons donc stocker un nombre dans la variable char car la variable typée char peut stocker des caractères, puis nous utiliserons la fonction static_cast () pour transtyper la valeur du caractère en valeur typée entière et la mettre dans int a, puis nous utiliserons une variable pour stocker sa valeur dans un tableau un par un.

Je vous remercie …..


Réponse 6:

Je n'écrirai pas le code, mais j'expliquerai du mieux que je peux. En utilisant l'en-tête ifstream, vous voudrez boucler jusqu'à ce que l'EOF (fin de fichier) soit trouvé sur votre objet ifstream. En boucle, lisez chaque ligne de texte dans une variable chaîne. Divisez (tokenize) chaque chaîne en parties séparées par des espaces. Pour chaque partie (jeton), testez pour voir si elle peut être convertie en entier - si c'est possible, ajoutez-la à votre liste, sinon passez à la suivante. Donc, essentiellement, vous aurez une boucle externe qui obtient des lignes de texte et une boucle interne qui divise chaque ligne de texte en parties et tente de créer un nombre à partir de celle-ci.

Une fois que vous avez renfloué la dernière itération des boucles intérieure et extérieure, vous avez une liste avec laquelle vous pouvez faire n'importe quoi.


Réponse 7:

Supposons que vous ayez un fichier nommé input.txt, vous pouvez utiliser les extraits de code suivants pour lire les entiers du fichier. J'espère que ça aide :-)

#comprendre en utilisant l'espace de noms std;const int sz = 1001; // définit sz à la taille maximale du tableautableau int [sz];int main(){ freopen ("input.txt", "r", stdin); index int = 0, num; /// scan jusqu'à la fin du fichier while (scanf ("% d", & num) == 1) { tableau [index ++] = num; } pour (int i = 0; i printf ("% d", tableau [i]); printf ("\ n"); return 0;}

Réponse 8:

Vous pourriez aimer commencer à apprendre à programmer…

Donc le fichier texte contient des chiffres (ASCII 48..57, peut-être «e» et «-» et «.») Et des séparateurs (ASCII 13,10,9,32, quel que soit votre poison).

Donc, vous allouez un assez grand int, long int quel que soit le tableau et commencez à le remplir tout en analysant le fichier octet par octet ou chaîne par chaîne jusqu'au séparateur suivant.

Vous savez pourquoi mon salaire est élevé? Parce que je l'ai fait tout seul, j'ai investi beaucoup de temps et les employeurs le savent.


Réponse 9:

Vous devez trouver un utilitaire sur Internet qui convertit votre fichier texte en C-array. Si votre fichier texte est écrit au format csv (valeurs séparées par des virgules), je pense que vous n'aurez aucun mal à trouver un tel utilitaire. En d'autres termes, votre fichier texte doit être conforme à une norme connue, dans ce cas vous le convertirez facilement en C-array.


Réponse 10:

La manière classique en C serait d'utiliser fscanf

Une manière C ++ pourrait être d'utiliser ifstream avec stringstream.

Vous n'aurez peut-être même pas besoin du stringstream.