Hallo, ich habe ein Programm geschrieben, welches eine Datei einließt, den string kurz verarbeitet und anschließend in eine neue Datei, den Text und die angehängten Strings schreibt. Es funktioniert auch einwandfrei, ABER die erste Zeile wird falsch in die Datei geprintet und ich finde den Fehler nicht. Ich freue mich über jede konstuktive Antwort. Bitte keine sinnfreien Kommentare. Vielen Dank schonmal.
Der Code:
PS: Es wird nach den Schlüsselwörtern gesucht, da die Ursprungsdatei mit den SQL-Befehlen unnötig viele Zeilenumbrüche hat, die JavaScript nicht aktzeptiert und deshalb hat der eingelesene Text x mal so viele Zeilen wie der Output.
Der Code:
C++:
#include <fstream>
#include <iostream>
#include <array>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string replaceAll(string subject, string search, string replace) { //funktion, die string sucht und erstezt
int pos = 0;
// funktion find gibt "string::npos if not found"
while ((pos = subject.find(search, pos)) != string::npos) {
//cout << "pos: " << pos << " - search: " << search << " - replace: " << replace << " - row: " << row;
subject.replace(pos, search.length(), replace);
pos += replace.length();
}//cout << endl;
return subject;
}
int main()
{
vector<string> text;
vector<string> temp;
string line1, line2, runtime = "Runtime.ExecuteQuery(\"", end = "\");";
array<string, 3> query = { "INSERT", "DELETE", "UPDATE" };
int i = 0;
cout << "Dateiname(input) ist dein SQL Befehl in Datei\n";
cout << "Dateiname(output) ist deine neue Datei.\n" << "\n\t\tHINWEIS: Dateiendung auch eingeben!\n";
cout << "Dateiname(input):";
cin >> line1;
ifstream input(line1, ios::in);//input modus zum lesen
if (!input.is_open())//prüfe ob öffnen fehlerfrei war
{
cout << "Dateifehler oder Datei nicht gefunden!(input)" << endl;
return 1;
}
cout << "Dateiname(output):";
cin >> line2;
fstream output(line2, std::ios::out); //output modus zum erstellen/schreiben
if (!output.is_open())//prüfe ob öffnen fehlerfrei war
{
cout << "Dateifehler oder Datei nicht gefunden!(input)" << endl;
return 1;
}
while (getline(input, line1))//text in array
{
line2 = replaceAll(line1, "\"", "\\\"");//setzt das \ vor das "
text.push_back(line2);
}
for (int j = 0; j < (int)text.size(); j++) {
if (text[j].find(query[0], 0) != string::npos) i = 0;//Gibt korrekten index für aktuellen loop
else if (text[j].find(query[1], 0) != string::npos) i = 1;
else if (text[j].find(query[2], 0) != string::npos) i = 2;
if (string::npos != text[j].find(query[i], 0))
{
output << runtime << text[j];//runtimestring+formatierter text, wenn keyword gefunden
}
if (string::npos == text[j].find(query[i], 0))
{
output << text[j];//wenn kein keyword, formatierten text anhängen
}
if (j < ((int)text.size() - 1) && ((string::npos != text[j + 1].find(query[0], 0)) || (string::npos != text[j + 1].find(query[1], 0)) || (string::npos != text[j + 1].find(query[2], 0)))) output << end << '\n';//falls folgezeile key hat, ende anhängen und umbruch
if (j == ((int)text.size() - 1)) output << end << '\n';
}
input.close();
output.close();
return 0;
}
PS: Es wird nach den Schlüsselwörtern gesucht, da die Ursprungsdatei mit den SQL-Befehlen unnötig viele Zeilenumbrüche hat, die JavaScript nicht aktzeptiert und deshalb hat der eingelesene Text x mal so viele Zeilen wie der Output.