ofstream in datei schreiben
-
ich möchte mit ofstream etwas in eine datei schreiben. sieht so aus mein code:
#include <iostream> #include <string> #include <vector> #include <windows.h> #include <fstream> using namespace std; int main(){ char chDateiname[260]; cout << "Dateinamen angeben: "; cin >> chDateiname; cout << "Directory: "; char chDirectory[200]; cin >> chDirectory; string sTemp; vector<string> vDateinamen; vector<string>::iterator i; HANDLE fHandle; WIN32_FIND_DATA wfd; fHandle=FindFirstFile( chDirectory, &wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { vDateinamen.push_back(wfd.cFileName); } } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); ofstream Output (chDateiname, ios::app); for (i=vDateinamen.begin(); i<vDateinamen.end(); i++) { cout << (*i)<<endl; sTemp = (*i); Output.write((char*) &sTemp, sizeof(sTemp)); } return 0; }nun hab ich aber das problem, dass alles was in die datei geschrieben wird binary ist. also zu gesicht bekomm ich nichts lesbares. woran kann das liegen?
PS: nur so nebenbei ich erhalte 4 von diesen warnungen:
C:\Programme\Microsoft Visual Studio\MyProjects\test\main.cpp(54) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocat
or<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug informationwas sagt sie mir?

-
std::cout << "Dateinamen: " << std::flush; std::string file_name; std::getline(std::cin, file_name); std::cout << "Verzeichnis: " << std::flush; std::string directory; std::getline(std::cin, directory);// Wenn schon std::string dann auch durchgehend ... und std::getline ist auch empfehlenswert ...
std::ofstream out_stream (file_name, std::ios::out | std::ios::app); for (unsigned int n = 0; n < vector_filename.size(); ++n) { std::cout << vector_filename[n] << std::endl; out_stream << vector_filename[n] << std::endl; // out_stream.write(vector_filename[n].c_str(), vector_filename[n].length()); } out_stream.close();So könnte man das auch machen ...
-
Also nochmal zusammengefasst:
#include <iostream> #include <string> #include <vector> #include <windows.h> #include <fstream> int main() { std::cout << "Dateinamen: " << std::flush; std::string file_name; std::getline(std::cin, file_name); std::cout << "Verzeichnis: " << std::flush; std::string directory; std::getline(std::cin, directory); std::vector<std::string> vector_filename; WIN32_FIND_DATA wfd; HANDLE hFile = FindFirstFile(directory.c_str(), &wfd); do { if (!((wfd.cFileName[0] == '.') && ((wfd.cFileName[1] == '.' && wfd.cFileName[2] == 0) || wfd.cFileName[1] == 0))) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) vector_filename.push_back(std::string(wfd.cFileName)); } } while (FindNextFile(hFile, &wfd)); FindClose(hFile); std::ofstream out_stream (file_name.c_str(), std::ios::out | std::ios::app); for (unsigned int n = 0; n < vector_filename.size(); ++n) { std::cout << vector_filename[n] << std::endl; out_stream << vector_filename[n] << std::endl; // out_stream.write(vector_filename[n].c_str(), vector_filename[n].length()); } out_stream.close(); return 0; }
-
fabiwde schrieb:
nun hab ich aber das problem, dass alles was in die datei geschrieben wird binary ist. also zu gesicht bekomm ich nichts lesbares. woran kann das liegen?
Bei Zeigern macht es wenig Sinn, die per write() zur schreiben (damit trägst du nur die Adresse des Strings in die Datei ein - und die kann beim nächsten Start schon wieder ganz woanders sein) - du mußt die Daten hinter dem Zeiger speichern.
PS: nur so nebenbei ich erhalte 4 von diesen warnungen:
C:\Programme\Microsoft Visual Studio\MyProjects\test\main.cpp(54) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocat
or<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug informationwas sagt sie mir?

Daß der Bezeichner reverse_iterator<const string*> etwas zu lang wird, wenn der Compiler ihn vollständig aufschlüsselt - für dein Programm hat das keine Auswirkungen, aber der Debugger wird den Bezeichner nicht korrekt verarbeiten können.
(wenn dich diese Meldungen stören, setz ein#pragma warning(disable:4786)an den Programmanfang)
-
fabiwde schrieb:
i
PS: nur so nebenbei ich erhalte 4 von diesen warnungen:
C:\Programme\Microsoft Visual Studio\MyProjects\test\main.cpp(54) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocat
or<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug informationwas sagt sie mir?

Das du den ollen VC6 wegschmeissen, und auf einen aktuellen VC upgraden sollst.
Die aktuelleren können nämlich mehr als 255 Zeichen in den Debuginfos verarbeiten. 