2017-05-04 2 views
0

J'essaie d'obtenir des données d'entrée à partir d'un fichier txt sur Linux/Mint. Ainsi, après avoir compilé le code, j'exécute la commande suivante: ./a.out output.txt Je dois remplir un tableau bidimensionnel mais comme un tableau irrégulier (le nombre de colonnes dans chaque rangée est différent). Donc, je veux le diviser en regardant le caractère ce qui est lu à partir du fichier. Si le caractère est '\ n', je veux remplir la deuxième ligne. Mais je suppose que je ne peux pas lire le caractère '\ n'. J'espère pouvoir expliquer le problème. J'écris le code, peut-être que ce sera plus clair.Comment puis-je obtenir le caractère ' n' du fichier d'entrée?

mon fichier input.txt est:

enter image description here

mon C++ partie de code est pour obtenir l'entrée:

for (int i = 0; i<n; i++) { 
    char ch; 
    cin >> ch; 
    int j = 0; 
    while (ch != '\n') { 
     arr[i][j] = ch; 
     cin >> ch; 
     j++; 
    } 
} 

Je veux que, si le caractère est égal à la « \ n 'alors le programme continue pour remplir le tableau à la rangée suivante.

arr[0][0] = 'a'; 
arr[0][1] = 'f' 
arr[0][2] = 'h' 

arr[1][0] = 'b' 
arr[1][1] = 'e' 
arr[1][2] = 'g' 

arr[2][0] = 'c' .......) 
+0

[ 'getline'] (http://www.cplusplus.com/reference/istream/istream/getline/) lit jusqu'à la fin d'une ligne – user463035818

+0

Non trop clair ce que vous voulez, mais pourquoi ne pas utiliser std :: get(). –

+0

Je vous recommande fortement d'utiliser 'std :: ifstream' pour entrer des fichiers texte, au lieu de' std :: cin'. Comme il a déjà été commenté, 'getline' est un bon choix pour lire le fichier d'entrée. – EuGENE

Répondre

1

Lorsque vous cin >> ch il sautera des espaces, qui comprend des espaces, des onglets et des sauts de ligne. Peut-être, vous devez lire des lignes entières en utilisant std::getline, puis traiter chaque ligne séparément.

Par exemple:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    char ch; 
    std::string line; 
    int ln = 0; 
    while (getline(cin, line)) // read entire line 
    { 
     istringstream is; 
     is.str(line); 
     while (is >> ch) // now read individual chars from that line 
      cout << "line: " << ln << " char: " << ch << endl; 
     ln++; 
    } 
} 

Et votre boucle doit être quelque chose comme ceci:

std::string line; 
for (int i=0; i<n; ++i) 
{ 
    char ch; 
    if (!std::getline(cin, line)) 
     break; 
    std::istringstream is; 
    is.str(line); 
    for (int j=0; is >> ch; ++j) 
     arr[i][j] = ch; 
} 

Vous omettez de détails sur la façon dont vous déclarez votre arr, mais il ne semble pas le code 'montré montré le manipulerait correctement. Peut-être, il serait préférable d'utiliser des vecteurs:

std::vector<std::vector<char> > arr; 
std::string line; 
char ch; 
while (std::getline(cin, line)) // cin should probably be replaced with ifstream 
{ 
    std::istringstream is; 
    is.str(line); 
    arr.push_back(vector<char>()); 
    for (int j=0; is >> ch; ++j) 
     arr.back().push_back(ch); 
} 
+0

@Bob__ oui, OP a omis une partie sur les tableaux de longueur variable et je suppose simplement que cela fonctionne, car la question ne portait pas sur la façon de faire "tableau irrégulier" mais sur comment lire les caractères et savoir quand une nouvelle ligne est rencontrée. Au début, je voulais commenter à propos de la définition de 'arr', mais il s'agit surtout de gérer les entrées. – Pavel