bräuchte mal ein bisschen hilfe bei c-arrays
-
char buffer[128048]; QFile fparse(s_file); fparse.open(IO_ReadWrite); if( fparse.readBlock(buffer, 128048) == 0 ) { cout<<"Datei ist leer"<<endl; } if( fparse.readBlock(buffer, 128048) > 0 ) { //fparse.readBlock(buffer); cout<<"Datei wird gelesen"<<endl; } if( fparse.readBlock(buffer, 128048) < 0 ) { cout<<"Fehler beim offnen"<<endl; } cout<<buffer;soo das hab ich schonmal als einlese-fix
, naja 
das ist ein kleiner auschnitt der auf den inhalt von buffer hinweist:
"//usr//bin/regsvr32" "//usr/bin/uninstaller" "//usr/bin/wcmd" "//usr/bin/widl" "//usr/bin/wine" "//usr/bin/wineboot" "//usr/bin/winebrowser" "//usr/bin/winebuild" "//usr/bin/winecfg" "//usr/bin/wineconsole" %dir "//usr/bin/winecpp" "//usr/bin/winedbg"ich will dann immer das "//usr/bin... durch bsp. "//opt/kde... ersetzen und das in jeder zeile. das hört sich jetzt ziemlich noob an und ich muss gestehen ich noch nicht wirklich darüber nachgedacht.
hat da jemand einen passenden codeschnipsel der mir die stapelverabeitung abnimmt
wenn nicht
, dann müsst ich mir wieder selbst ein parser basteln
.
kennt da wär vielleich eine funktion?mfg
-
Also in-place kannst du's mal vergessen, wenn du das so in einer langen Wurst im Speicher liegen hast. Entweder du verwendest boost::regex oder du baust dir deine eigene state machine und durchläufst das ganze einmal. Vermutlich würde sich aber eine bessere Datenstruktur (z.B. jede Zeile in einen eigenen string) empfehlen.
-
ich versteh das jetzt nich ganz! theoretisch müsste man doch nur die position im array suchen(ich glaub mit find) löscht den teil und schiebt ein string davor?!
-
aprpo, wenn ich jede zeile extra einlese würde sich doch theretisch nichts ändern, da hatte ich auch dran gedacht? ich hätte doch dann das selkbe problem.

-
@string: Um dir viel Arbeit zu ersparen, würde ich mir mal die Klasse std::string anschauen. In ihr sind bereits Methoden namens find(), replace(), etc. definiert. Desweiteren schadet ein Blick in die STL sicherlich auch nicht

Lösungsansatz mit std::string und std::vector für dein Beispiel: (Ungetestet...)
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; void print(const vector<string>& vec) { for(vector<string>::const_iterator it = vec.begin(); it != vec.end(); ++it) cout << *it << '\n'; } int main(int argc, char* argv[]) { if(argc != 4) { cout << "\n Usage: program.exe txtfile to_replace replace_through\n"; return -1; } ifstream in(argv[1]); if(in.is_open()) { vector<string> v; string tmp; // Datei in vector<string> lesen while(getline(in, tmp)) v.push_back(tmp); cout << "\n\n"; print(v); cout << "\n\n"; // ersetzen... for(size_t i = 0; i < v.size(); ++i) { size_t pos = v[i].find(argv[2]); if(pos != string::npos) v[i].replace(pos, strlen(argv[2]), argv[3]); } print(v); } return 0; }Caipi
-
jo das ist es! danke
, der grund das ich keine dyn. arrays verwendet habe war weil ich in Qt, erst mal ein bissel mit den QStrings herumexperimentiert habe. Aber die typumwandlung soll nicht das problem sein. danke schonmal 
-
ich bekomm bei der leicht geänderten funktion noch den fehler:
In file included from .ui/form1.cpp:20: .ui/../form1.ui.h: In member function `virtual void Form1::openFile()': .ui/../form1.ui.h:43: Fehler: Ungültige Umformung von »void*« in »char**« .ui/../form1.ui.h:43: Fehler: »QString« kann nicht nach »size_t*« für Argument »2« nach »__ssize_t getline(char**, size_t*, FILE*)« umgewandelt werden make: *** [.obj/form1.o] Fehler 1weiß jemand warum?
void Form1::openFile() { QString rw = lineEdit3->displayText(); QString sw = lineEdit2->displayText(); //int sw_length = sw.length(); ifstream file(s_file); if(file.is_open() ) { vector<QString> v; QString line; // Datei in vector<QString> lesen while(getline(file, line) ) v.push_back(line); // ersetzen... for(size_t i = 0; i < v.size(); ++i) { size_t pos = v[i].find(sw); if(pos != string::npos) v[i].replace(pos, sw.length(), rw ); } } }