2017-03-03 3 views
2

Ich habe eine Eingabetextdatei von 4 Zeilen, jede Zeile hat 80 Zeichen feste Länge. Ich möchte jedes Komma durch ein Leerzeichen ersetzen. Ich habe Code wie folgt geschrieben geschrieben und kompiliert und in Code :: Blocks IDE ausgeführt. Das Problem ist, dass die Ausgabedatei eine zusätzliche Zeile enthält. Bitte helfen Sie mir, den Fehler zu korrigieren. Ich bin ein Anfänger in C++.Ersetzen Sie ein Zeichen in einer Datei mit C++

inputFile

outputFile

#include <iostream> 
#include <fstream> 
#include <string> 


using namespace std; 

int main() 
{ 
ifstream in("circArc.txt", ios::in | ios::binary); 


if(!in) 
{ 
    cout << "Cannot open file"; 
    return 1; 
} 

ofstream out("readInt.txt", ios::out | ios::binary); 
if(!out) 
{ 
    cout << "Cannot open file"; 
    return 1; 
} 

string str; 
char rep[80]; //replace array 

while(in) 
{ 
    getline(in,str); 
    for(int i=0; i<80; i++) 
    { 
     if(str[i] == ',') 
      rep[i] = ' '; 
     else 
      rep[i] = str[i]; 
     out.put(rep[i]); 
    } 
    out << endl; 

} 
in.close(); 
out.close(); 
return 0; 
} 

Antwort

1

Das Problem mit der Verwendung

while(in) 
{ 
    getline(in,str); 

ist, dass Sie nicht überprüfen, ob getline erfolgreich war. Sie fahren fort, str unabhängig zu verwenden. Ersetzen

while(in) 
{ 
    getline(in,str); 
    ... 
} 

mit

while(getline(in,str)) 
{ 
    ... 
} 
+0

@Antony, Werfen Sie einen Blick auf die Antwort auf diese Frage SO. http://stackoverflow.com/questions/42571529/how-to-count-the-number-of-lines-in-a-file-using-c. Es scheint, als ob Sie in dieselbe Situation geraten sind. –

+0

@Antony: Weil Sie getline() zweimal aufrufen – androidFan

0

Halten Sie die while() Schleife, aber es einmal tun, bevor/außerhalb der while-Schleife und dann innerhalb der while-Schleife in der letzten Zeile:

#include <iostream> 
#include <fstream> 
#include <string> 


using namespace std; 

int main() 
{ 
ifstream in("circArc.txt", ios::in | ios::binary); 


if(!in) 
{ 
    cout << "Cannot open file"; 
    return 1; 
} 

ofstream out("readInt.txt", ios::out | ios::binary); 
if(!out) 
{ 
    cout << "Cannot open file"; 
    return 1; 
} 

string str; 
char rep[80]; //replace array 

getline(in,str); 

while(in) 
{ 
    for(int i=0; i<80; i++) 
    { 
     if(str[i] == ',') 
      rep[i] = ' '; 
     else 
      rep[i] = str[i]; 
     out.put(rep[i]); 
    } 
    out << endl; 

    getline(in,str); 

} 

in.close(); 
out.close(); 
return 0; 
} 
+0

Problem dadurch gelöst viel zu. – Antony

0

Ich denke, das Problem ist hier die Ausgangsbedingung in Ihrer while Schleife. Sie können:

while(getline(in, str)) { 
    if (in.eof()) { 
     break; 
    } 
    /** This will get you out if you are reading past the end of file 
    * which seems to be the problem. 
    */ 
    ... 
0

Das Problem ist, dass std::getline das Zeichen End-of-line entfernt, wenn es so existiert Sie können nicht (leicht) sagen, wenn das letzte Zeichen eine End-of-line war oder nicht.

Es scheint mir, Sie brauchen sich nicht um das Format Ihrer Daten für diese Aufgabe wory, so dass Sie es nur ein Zeichen in einer Zeit verarbeiten konnte:

ifstream in("circArc.txt", ios::in | ios::binary); 

ofstream out("readInt.txt", ios::out | ios::binary); 

for(char c; in.get(c); out.put(c)) 
    if(c == ',') 
     c = ' '; 

Wenn Sie wirklich Linie bearbeiten möchten Zeile, dann müssen Sie prüfen, ob die Linie in gelesen enthielt einen End-of-Line-Charakter und sind nur eine End-of-line in der Ausgabe, wenn es eine in dem Eingang ist:

ifstream in("circArc.txt", ios::in | ios::binary); 

ofstream out("readInt.txt", ios::out | ios::binary); 

for(std::string line, eol; std::getline(in, line); out << line << eol) 
{ 
    // only add an eol to output if there was an eol in the input 
    eol = in.eof() ? "":"\n"; 

    // replace ',' with ' ' 
    std::transform(std::begin(line), std::end(line), std::begin(line), 
     [](char c){ if(c == ',') return ' '; return c; }); 
} 
Verwandte Themen