*
@double* T:
cout << "Vector: ";
for(int i=0; i<sizeof(vec); ++i)
cout << vec[i];
cout << endl;
du bist dir sicher, dass das sooft durchläuft, wie du vermutest?
Nagut, analysieren wir mal deinen Quelltext:
Code 01
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
if(argc>1)
{
//habe hier auch schon true probiert, aber auch ohne erfolg
char c;
vector<char> vec;
ifstream input (argv[1], ios::binary);
input.seekg(0, ios_base::beg);
while(!input.eof()){
input.get(c);
vec.push_back(c);
}
input.close();
ofstream output ("out.txt", ios::binary);
for(int i=0; i<vec.size(); i++)
output << vec[i];
output.close();
}
return EXIT_SUCCESS;
}
if(argc>1)
{
//habe hier auch schon true probiert, aber auch ohne erfolg
Du willst einen Integer auf "true" testen? Das ist zwar möglich, aber definitiv falsch, wenn du dir die Definition von argc anguckst.
char c;
vector<char> vec;
Warum legst du die Variablen schon hier an? Wenn sich die Datei nicht öffnen lässt, kannst du dir das ganz sparen.
ifstream input (argv[1], ios::binary);
Du öffnest die Datei binary? Ließt aber mit get ein? read/write wäre dann korrekt!
while(!input.eof()){
input.get(c);
vec.push_back(c);
}
Aua. Das ließt definitiv ein Zeichen zu viel ein
while (input >> c) vec.push_back(c);
sollte ausreichend sein.
input.close();
macht der Destruktor von input automatisch!
ofstream output ("out.txt", ios::binary);
for(int i=0; i<vec.size(); i++)
output << vec[i];
output.close();
(1) iteratoren sind hier wesentlich schneller
(2) du öffnest binary, streamst aber rein (statt write)
(3) close wird vom Destruktor von ouput automatisch aufgerufen
Code 02
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(int argc, char *argv[]){
for(int i=0; i<sizeof(argv); i++){
cout << argv[i] << endl;
}
if(false){ //<---------!!
cout << "Parameter gefunden!" << endl;
char c;
vector<char> vec;
ifstream input (argv[1], ios::binary);
while(!input.eof()){
input.get(c);
vec.push_back(c);
}
cout << "Laden beendet!" << endl;
input.close();
ofstream output ("out.txt", ios::binary);
for(int i=0; i<vec.size(); i++)
output.write(reinterpret_cast<const char*>(&vec[i]), sizeof(vec));
output.close();
cout << "Schreiben beendet!" << endl;
}
else{
cout << "keine Parameter gefunden!" << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
S. Code 01!
for(int i=0; i<sizeof(argv); i++){
cout << argv[i] << endl;
}
Aua. Lass den Quatsch und nutz argc.
if(false){ //<---------!!
Das wird definitiv NIE in erfüllung gehen -.-
=>
#include <iostream>
#include <fstream>
#include <vector>
int main(int argc, char** argv)
{
if (argc != 2) /* argc == 1, wenn kein Parameter übergeben wurde. argv[0] == programmname */
{
std::cerr << "FEHLER: Es wurden keine korrekten Parameter übergeben!\n" << argv[0] << " [-sourcefile]" << std::endl;
return 1;
}
std::ifstream file_stream_source(argv[1]);
if (!file_stream_source) // konnte Datei geöffnet werden?
{
std::cerr << "FEHLER: Datei(\"" << argv[1] << "\") konnte nicht geöffnet werden!" << std::endl;
return 2;
}
std::vector<char> data;
char temp_char;
while (file_stream_source >> temp_char) data.push_back(temp_char);
std::ofstream file_stream_destination("output.txt");
for (std::vector<char>::const_iterator it(data.begin()); it != data.end(); ++it)
file_stream_destination << *it;
}
. So geht das, mit deinem Ansatz (jedes Zeichen einzellnt einlesen [in vector] und dann wieder ausgeben). Einfacher geht es per iteratoren:
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(int argc, char** argv)
{
if (argc != 2) /* argc == 1, wenn kein Parameter übergeben wurde. argv[0] == programmname */
{
std::cerr << "FEHLER: Es wurden keine korrekten Parameter übergeben!\n" << argv[0] << " [-sourcefile]" << std::endl;
return 1;
}
std::ifstream file_stream_source(argv[1]);
if (!file_stream_source) // konnte Datei geöffnet werden?
{
std::cerr << "FEHLER: Datei(\"" << argv[1] << "\") konnte nicht geöffnet werden!" << std::endl;
return 2;
}
std::vector<char> data(std::istream_iterator<char>(file_stream_source), std::istream_iterator<char>());
std::ofstream file_stream_destination("output.txt");
std::copy(data.begin(), data.end(), std::ostream_iterator<char>(file_stream_destination));
}
Und noch einfacher ist es, direkt den Buffer zu kopieren
#include <iostream>
#include <fstream>
int main(int argc, char** argv)
{
if (argc != 2) /* argc == 1, wenn kein Parameter übergeben wurde. argv[0] == programmname */
{
std::cerr << "FEHLER: Es wurden keine korrekten Parameter übergeben!\n" << argv[0] << " [-sourcefile]" << std::endl;
return 1;
}
std::ifstream file_stream_source(argv[1]);
if (!file_stream_source) // konnte Datei geöffnet werden?
{
std::cerr << "FEHLER: Datei(\"" << argv[1] << "\") konnte nicht geöffnet werden!" << std::endl;
return 2;
}
std::ofstream file_stream_destination("output.txt");
file_stream_destination << file_stream_source.rdbuf();
}
... sodele