2017-07-26 5 views
0

J'ai lutté avec ce bug pendant un moment. J'utilise Windows 10 et code :: blocks 16.01 MinGW.caractère par caractère réponse incohérente à n

Je veux comparer c à un caractère de ligne de fin.

Un programme sur mon système fonctionne avec succès, juste pour passer la ligne d'en-tête d'un fichier:

while(c!='\n') 
{ 
    c = fgetc(traverse); 
    if(c == EOF) 
     return(1); 
} 

où traverse a été ouvert à l'aide

fopen("traverse.dat", "r"); 

cependant, mes autres programmes:

FILE * infile; 

/* Open a large CSV */ 
infile = fopen("Getty_Megatem.csv", "r"); 
if(infile == NULL) 
{ 
    printf("no file"); 
    return(EXIT_FAILURE); 
} 
char c = 0; 
int i = 0; 

/* Opens file successfully */ 
printf("File opened\n"); 

/* Count commas in first line */ 
while(c != '\n'); 
{ 
    c = fgetc(infile); 
    if(c == ',') 
     i++; 
    if(c == EOF) 
     return(EXIT_FAILURE); 
} 

printf("Number of commas: %i\n", i); 

fclose(infile); 

return(EXIT_SUCCESS); 

et

ifstream infile; 
char c; 
string mystr; 

infile.open("ostring.dat"); 

// Skip a line 
while (c!= '\n') 
    infile >> c; 

getline(infile, mystr); 

et (celui que je veux vraiment travailler)

ifstream emdata; 

string firstline; 
char c = 0; 
int i = 0; 

vector<double> vdata; 

// redundancy 
vdata.reserve(10000); 

// There are ~ 300 doubles per line 
emdata.open("Getty_Megatem.csv"); 

// Skip first line 
getline(emdata, firstline); 

while(c != '\n' && c != EOF) 
{ 
    emdata >> vdata[i] >> c; 
    cout << vdata[i] << ","; 
    i++; 

    if(i == 999) 
    { 
     cout << "\n\ni>9999"; 
     break; 
    } 
} 


emdata.close(); 
return 0; 

ne réussissent pas, ils compiler et exécuter ensuite lire le flux toujours - ou jusqu'à ce que mes itérations maximum de 9999 soit atteint. Tous ces fichiers contiennent de nouvelles lignes.

+0

Je ne comprends pas pourquoi ne vous contentez pas 'getline()' chaque ligne? –

+0

Je veux lire la ligne dans le double vecteur – Edward

+3

Votre variante C a cette ligne: 'while (c! = '\ N');' Il y a un point-virgule à la fin qui est interprété comme une instruction vide. Effectivement, cela dit: Ne faites rien pendant que «c» n'est pas une nouvelle ligne, ce qui sera vrai pour toujours. Supprimez ce point-virgule. –

Répondre

1

Vous utilisez entrée formatée pour obtenir un caractère lorsque vous devez utiliser non formaté entrée:

char c; 
if (cin.get(c)) ... 

ou

int c; 
c = cin.get(); 
if (c != cin.eof()) ... 

L'opérateur >> supprime les espaces, y compris les nouvelles lignes.

0

Comme indiqué dans les commentaires, le premier ne fonctionnera pas car il a un; juste après le temps(). Le problème avec les deux autres est que l'opérateur >> ne lit pas '\ n' et les espaces, ils sont traités comme des séparateurs. C'est pourquoi les deux derniers ne fonctionneront pas.

Pour réparer le 1er il suffit de retirer le; après la déclaration while

//while(c != '\n'); 
while(c != '\n') 
{ 
    c = fgetc(infile); 
    if(c == ',') 
     i++; 
    if(c == EOF) 
     return(EXIT_FAILURE); 
} 

Et voici mes suggestions pour les autres:

2 - oublier le temps, si vous voulez sauter une ligne, obtenir une ligne et ne rien faire avec elle.

ifstream infile; 
char c; 
string mystr; 

infile.open("ostring.dat"); 

// Skip a line 
getline(infile, mystr); 
/*while (c!= '\n') 
    infile >> c;*/ 

getline(infile, mystr); 

3 - obtenir la ligne et utiliser stringstream pour obtenir les entrées dont vous avez besoin

ifstream emdata; 

string firstline; 
char c = 0; 
int i = 0; 

vector<double> vdata; 

// redundancy 
vdata.reserve(10000); 

// There are ~ 300 doubles per line 
emdata.open("Getty_Megatem.csv"); 

// Skip first line 
getline(emdata, firstline); 
//get second line 
getline(emdata, firstline); 
// replace commas with spaces 
std::replace(firstline.begin(),firstline.end(),',',' '); 
stringstream ss(firstline);// 
while(ss.rdbuf()->in_avail()!=0)//loop until buffer is empty 
{ 
    ss >> vdata[i]; 
    cout << vdata[i] << ","; 
    i++; 

    if(i == 999) 
    { 
     cout << "\n\ni>9999"; 
     break; 
    } 
} 


emdata.close(); 
return 0;