2016-03-24 7 views
0

Was ich versuche zu tun, ist eine Datei mit einem String zu öffnen, ersetzen Sie jedes Zeichen in dieser Datei mit [Zeichen + 37], und geben Sie es auf eine andere Datei "output.txt". Was ich vermute ein Problem mit der in Funktion ...String-Manipulation und Datei IO in C++?

#include "stdafx.h" 
#include <string> 
#include <iostream> 
#include <fstream> 

using namespace std; 

void encrypt(string text, int size) { 
int i; 
    for (i = 0; i < size; i++) { 
     text.at(i) = text.at(i) + 37; 
    } 
} 

int main() 
{ 
string string; 
int length = string.length(); 

ifstream infile; 
infile.open("input.txt"); 

if (infile.fail()) { 
    cerr << "Error Opening File. " << endl; 
    exit(1); 
} 

infile >> string; 

infile.close(); 

encrypt(string, length); 

ofstream outfile; 
outfile.open("output.txt"); 

if (infile.fail()) { 
    cerr << "Error Opening File. " << endl; 
    exit(1); 
} 

outfile << string; 
outfile.close(); 

return 0; 
} 
+0

Sie arbeiten an einer Kopie Ihres Strings, suchen Sie nach Wert und nach Referenz – BeyelerStudios

Antwort

1

Das erste, was sollten Sie Ihre Verschlüsselungsfunktion string Parameter ändern Typ Referenz:

void encrypt(string& text, int size) { 

sonst string text eine lokale Variable ist in dieser Funktion, und alle Änderungen werden nach dem Ende verloren gehen.

Eine andere Sache ist, dass Sie int size nicht benötigen, verwenden Sie stattdessen text.size(). Auch sehe ich Sie vorbei wie Größe, Ergebnis dieser Code:

string string; 
int length = string.length(); 

hier Länge wird immer Null, auch - wie Sie Ihren Variablenname ist der gleiche wie der Typ std :: string sehen können, warum Sie einen solchen Namen verwenden? Dies ist eines der Grund, warum Sie nicht using namespace std;

Dritte Sache, nach dem Gebrauch sollte:

ofstream outfile; 
outfile.open("output.txt"); 

Sie überprüfen, ob es in Zustand nicht verwendet infile statt outfile

if (infile.fail()) { 

besser ändern Diese Prüfung an if (!infile) {

0

Wie von @marcinj gesagt, ändert nur Ihre encrypt Routine eine Kopie der ursprünglichen Zeichenfolge, und die Kopie geht verloren, wenn die Funktion existiert.

Aber was Sie tun, ist ziemlich gefährlich: Ihre Verschlüsselungsfunktion kann druckbare Zeichen annehmen und sie dann in nicht druckbare Zeichen umwandeln, während Sie die Textschnittstelle von Streams verwenden. Selbst wenn es funktioniert, enthält die Datei möglicherweise keine korrekte Zeichenfolge.

Zum Beispiel das Zeichen ù (die in französisch üblich ist) wird ein Raum geworden, die die String-Begrenzer ist, und noch schlimmer, die õ (common in portugiesisch) wird ein \n nicht der Û gesprochen werden, dass eine geben Nullzeichen!