App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
C++ /// Datei inklusive Leerzeichen einlesen?
- Ersteller Gruß Thomas!
- Erstellt am
Gruß Thomas!
Grand Admiral Special
- Mitglied seit
- 27.03.2008
- Beiträge
- 2.027
- Renomée
- 118
- Standort
- Bayreuth
- Aktuelle Projekte
- Virtual Prairie, Docking@Home
- Lieblingsprojekt
- QMC@Home, Virtual Prairie
- Meine Systeme
- FX8120
- BOINC-Statistiken
- Mein Laptop
- Thinkpad T495 / 40GB RAM
- Prozessor
- AMD Ryzen 9 3900X
- Mainboard
- Gigabyte X570 Aorus Pro
- Kühlung
- AMD Wraith Prism
- Speicher
- 48GB Corsair Vengeance LPX DDR4 3200MHz
- Grafikprozessor
- AMD RX480 8GB
- Gehäuse
- Lian Li PC-A05NB
- Betriebssystem
- Windows 10
- Webbrowser
- Google Chrome
- Verschiedenes
- http://www.sysprofile.de/id46649
- Schau Dir das System auf sysprofile.de an
Die Frage steht oben, ich kriegs nicht fertig, mit f.open() die Leerzeichen mit einzulesen, die gehen immer verloren, da er aufhört einzulesen nach einem Leerzeichen
Nachtschicht
Admiral Special
f.getline() sollte es tun.
http://www.cplusplus.com/reference/iostream/ifstream/
Oder mit der C-stdio lib und FILE* f = fopen(...), die Zeilen dann mit fgets lesen.
http://www.cplusplus.com/reference/iostream/ifstream/
Oder mit der C-stdio lib und FILE* f = fopen(...), die Zeilen dann mit fgets lesen.
Gruß Thomas!
Grand Admiral Special
- Mitglied seit
- 27.03.2008
- Beiträge
- 2.027
- Renomée
- 118
- Standort
- Bayreuth
- Aktuelle Projekte
- Virtual Prairie, Docking@Home
- Lieblingsprojekt
- QMC@Home, Virtual Prairie
- Meine Systeme
- FX8120
- BOINC-Statistiken
- Mein Laptop
- Thinkpad T495 / 40GB RAM
- Prozessor
- AMD Ryzen 9 3900X
- Mainboard
- Gigabyte X570 Aorus Pro
- Kühlung
- AMD Wraith Prism
- Speicher
- 48GB Corsair Vengeance LPX DDR4 3200MHz
- Grafikprozessor
- AMD RX480 8GB
- Gehäuse
- Lian Li PC-A05NB
- Betriebssystem
- Windows 10
- Webbrowser
- Google Chrome
- Verschiedenes
- http://www.sysprofile.de/id46649
- Schau Dir das System auf sysprofile.de an
PHP:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <io.h>
#include <sys/stat.h>
using namespace std;
int main()
{
char * nick;
cout<<"Geben Sie Ihren neuen Nick ein!\n";
cin>>nick;
FILE * pFile;
char mystring [100];
pFile = fopen ("config.cfg" , "r+");
if (pFile == NULL) perror ("Error opening file");
else {
do{
fgets(mystring, 100, pFile);
puts(mystring);
}
while(strcmp(mystring, "name \"Player\"\n")!=0);
puts(mystring);
}
fclose(pFile);
system("PAUSE");
}
Soweit bin ich jetzt gekommen (includes bitte nicht beachten xD).
Finden tut er schon mal, das was ich will.
Jetzt möchte ich nur noch das, was er findet editieren, wie geht das?
Zuletzt bearbeitet:
Onkel_Dithmeyer
Redaktion
☆☆☆☆☆☆
- Mitglied seit
- 22.04.2008
- Beiträge
- 12.943
- Renomée
- 4.014
- Standort
- Zlavti
- Aktuelle Projekte
- Universe@home
- Lieblingsprojekt
- Universe@home
- Meine Systeme
- cd0726792825f6f563c8fc4afd8a10b9
- BOINC-Statistiken
- Prozessor
- Ryzen 9 3900X @4000 MHz//1,15V
- Mainboard
- MSI X370 XPOWER GAMING TITANIUM
- Kühlung
- Custom Wasserkühlung vom So. G34
- Speicher
- 4x8 GB @ 3000 MHz
- Grafikprozessor
- Radeon R9 Nano
- Display
- HP ZR30W & HP LP3065
- SSD
- 2 TB ADATA
- Optisches Laufwerk
- LG
- Soundkarte
- Im Headset
- Gehäuse
- Xigmatek
- Netzteil
- BeQuiet Dark Pro 9
- Tastatur
- GSkill KM570
- Maus
- GSkill MX780
- Betriebssystem
- Ubuntu 20.04
- Webbrowser
- Firefox Version 94715469
- Internetanbindung
- ▼100 Mbit ▲5 Mbit
Du speicherst es in ner TXT und editiert sie?!
Gruß Thomas!
Grand Admiral Special
- Mitglied seit
- 27.03.2008
- Beiträge
- 2.027
- Renomée
- 118
- Standort
- Bayreuth
- Aktuelle Projekte
- Virtual Prairie, Docking@Home
- Lieblingsprojekt
- QMC@Home, Virtual Prairie
- Meine Systeme
- FX8120
- BOINC-Statistiken
- Mein Laptop
- Thinkpad T495 / 40GB RAM
- Prozessor
- AMD Ryzen 9 3900X
- Mainboard
- Gigabyte X570 Aorus Pro
- Kühlung
- AMD Wraith Prism
- Speicher
- 48GB Corsair Vengeance LPX DDR4 3200MHz
- Grafikprozessor
- AMD RX480 8GB
- Gehäuse
- Lian Li PC-A05NB
- Betriebssystem
- Windows 10
- Webbrowser
- Google Chrome
- Verschiedenes
- http://www.sysprofile.de/id46649
- Schau Dir das System auf sysprofile.de an
Ich versteh nicht ganz, was du meinst. Die Datei existiert bereits und da drin steht schon was!
flybyray
Vice Admiral Special
Der wollte dich auf den Arm nehmen.Ich versteh nicht ganz, was du meinst. Die Datei existiert bereits und da drin steht schon was!
Es gibt verschiedene Ansätze Dateien zu manipulieren. Der wohl einfachste ist es
die Datei komplett ein zu lesen, im Speicher zu verändern und wieder komplett neu zu schreiben/überschreiben. Hier sollte man sich im klaren sein, dass das nur bis zu einer bestimmten Dateigröße (!Speicher!) funktioniert. Es gibt zahlreiche Editoren die so arbeiten, oder dann spezielle Editoren, die direkt auf der Festplatte arbeiten können.
Zunächst ein paar Kommentare zu deinem Code:
Code:
char * nick;
cout<<"Geben Sie Ihren neuen Nick ein!\n";
cin>>nick;
Vielleicht solltest du auch einheitlich C oder C++ include Bibliotheken verwenden und nicht alles mischen wie es passt.
So noch ganz Quick&Dirty eine mögliche Lösung:
Code:
// editconfig.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const char* FILE_NAME = "config.cfg";
const unsigned int BUF_LEN = 15;
void readFile(string name, vector<string> &buffer);
void writeFile(string name, vector<string> &buffer);
int _tmain(int argc, _TCHAR* argv[])
{
string filename = FILE_NAME;
string nick;
cout<<"Geben Sie Ihren neuen Nick ein!\n";
cin >> nick;
vector<string> filebuffer;
// filebuffer: Speicher für Dateiinhalt Zeilen werden als Strings in einem vector gespeichert
vector<string>::iterator zeile;
// zeile: als iterator zum Zugreifen auf einzelne Zeilen aus dem filebuffer Vektor
readFile(filename,filebuffer);
/* Ausgabe der eingelesenen Datei
for(zeile = filebuffer.begin(); zeile != filebuffer.end(); zeile++) {
cout << (*zeile) << endl;
}
*/
/* bearbeite Datei */
for(zeile = filebuffer.begin(); zeile != filebuffer.end(); zeile++)
{
if ( (*zeile).find("name \"Player\"") != string::npos )
{
(*zeile).clear();
(*zeile).append( "name \"" ).append( nick ).append( "\"" );
}
}
/**/
/* Ausgabe der bearbeiteten Datei
for(zeile = filebuffer.begin(); zeile != filebuffer.end(); zeile++) {
cout << (*zeile) << endl;
}
*/
writeFile(filename,filebuffer);
return 0;
}
void readFile(string name, vector<string> &buffer)
{
char _buf[BUF_LEN]; // buffer zum einlesen der datei
fstream fs(name.c_str(), ios::in); // filestream objekt zum einlesen einer datei
if (!fs.bad())
{//keine Fehler, Datei fertig zum lesen
string _line;
// _line: enthält die aktuelle zeile bis zur leseposition
while(!fs.eof())
{//Dateiende nicht erreicht, weiter lesen
string _str;
// _str: enthält ein Fragment der aktuellen Zeile
fs.getline(&_buf[0],sizeof(_buf));
_str.append(&_buf[0]);
if( fs.fail() ) {
if(_str.length() == 0) {
//Ende der Zeile erreicht!
fs.clear( ~ios::failbit & fs.rdstate());
_line.append(_str);
buffer.push_back(_line);
_line.clear();
} else if (_str.length() == (sizeof(_buf) - 1) ) {
//noch nicht am Ende der Zeile
fs.clear( ~ios::failbit & fs.rdstate());
_line.append(_str);
} else {
//sonstiger Fehler
cerr << "Fehler beim lesen" << endl;
exit(1);
}
} else {
//Ende der Zeile (zeile kürzer als buffer)
_line.append(_str);
buffer.push_back(_line);
_line.clear();
}
}
fs.close();
}
}
void writeFile(string name, vector<string> &buffer)
{
char _buf[BUF_LEN]; // buffer zum einlesen der datei
fstream fs(name.c_str(), ios::out); // filestream objekt zum schreiben einer datei
if (!fs.bad())
{//keine Fehler, Datei fertig zum lesen
vector<string>::iterator _line = buffer.begin();
fs << (*_line++);
if (_line != buffer.end()) {
for(; _line != buffer.end(); _line++)
fs << endl << (*_line);
}
fs.close();
}
}
Gruß Thomas!
Grand Admiral Special
- Mitglied seit
- 27.03.2008
- Beiträge
- 2.027
- Renomée
- 118
- Standort
- Bayreuth
- Aktuelle Projekte
- Virtual Prairie, Docking@Home
- Lieblingsprojekt
- QMC@Home, Virtual Prairie
- Meine Systeme
- FX8120
- BOINC-Statistiken
- Mein Laptop
- Thinkpad T495 / 40GB RAM
- Prozessor
- AMD Ryzen 9 3900X
- Mainboard
- Gigabyte X570 Aorus Pro
- Kühlung
- AMD Wraith Prism
- Speicher
- 48GB Corsair Vengeance LPX DDR4 3200MHz
- Grafikprozessor
- AMD RX480 8GB
- Gehäuse
- Lian Li PC-A05NB
- Betriebssystem
- Windows 10
- Webbrowser
- Google Chrome
- Verschiedenes
- http://www.sysprofile.de/id46649
- Schau Dir das System auf sysprofile.de an
Hmmm, ich hab das Gefühl, dass ich das was du da schreibst nur ansatzweise versteh xD
Wie meinst du das mit irgendwo in den Speicher schreiben?
Besser so?
Wie meinst du das mit irgendwo in den Speicher schreiben?
PHP:
char nick[80];
cout<<"Geben Sie Ihren neuen Nick ein!\n";
cin.getline(nick, sizeof(nick));
Besser so?
Zuletzt bearbeitet:
flybyray
Vice Admiral Special
Prima! Viel besser!!! Das davor war deswegen so kritisch weil du den Pointer nick nicht initialisiert hast, er daher irgendwo hin gezeigt hat (undefiniert). Bei ordentlichen Debug IDE´s werden sie meistens trotzdem initialisiert (zB mit 0xcccccccc, bei Zugriff auf diese Speicherzelle wird dann ein halt/stop des Programms und die Rückkehr zum Debugger eingeleitet).Besser so?
In der neuen Version von dir initialisierst du nick mit der Adresse auf einen 80 Byte großen reservierten Bereich und erlaubst cin sogar nur diese 80 Byte zu verwenden. Längere Namen akzeptiert cin nicht, damit kann der Speicher auch nicht überschrieben werden. Nur bin ich mir jetzt nicht ganz sicher ob es bei cin.getline nicht sogar nur 79 Zeichen sein sollten. Müsste man mal testen was da wirklich im Speicher steht wenn man da einen 80 Zeichen Namen eingibt. Zeichenfolgen sollen halt immer null-terminiert sein.
Gruß Thomas!
Grand Admiral Special
- Mitglied seit
- 27.03.2008
- Beiträge
- 2.027
- Renomée
- 118
- Standort
- Bayreuth
- Aktuelle Projekte
- Virtual Prairie, Docking@Home
- Lieblingsprojekt
- QMC@Home, Virtual Prairie
- Meine Systeme
- FX8120
- BOINC-Statistiken
- Mein Laptop
- Thinkpad T495 / 40GB RAM
- Prozessor
- AMD Ryzen 9 3900X
- Mainboard
- Gigabyte X570 Aorus Pro
- Kühlung
- AMD Wraith Prism
- Speicher
- 48GB Corsair Vengeance LPX DDR4 3200MHz
- Grafikprozessor
- AMD RX480 8GB
- Gehäuse
- Lian Li PC-A05NB
- Betriebssystem
- Windows 10
- Webbrowser
- Google Chrome
- Verschiedenes
- http://www.sysprofile.de/id46649
- Schau Dir das System auf sysprofile.de an
Ich glaub das auch , dass er nur 79 Zeichen einliest, aber in meinem C++ Buch stands so beschrieben, weil da müsset ja noch das \0 Zeichen dabei sein oder nicht?
PuckPoltergeist
Grand Admiral Special
Ganz blöde Frage, muss es wirklich C++ sein? Es gibt einige Sprachen, die gerade dafür wesentlich besser geeignet sind.
wori
Commander
- Mitglied seit
- 06.05.2005
- Beiträge
- 161
- Renomée
- 0
Ein char-Array von 80 Zeichen sind 79 Zeichen plus '\0'
char* nick ist ein nicht initialisierter Pointer also Teufelszeug und igitte bäh pfui.
Es sei denn man hat bei größeren Projekten Spaß an ausgiebigen Debugsitzungen.
Persönlich bevorzuge ich
char nick [80] = memset(nick,0,sizeof(nick));
Dann ist nicht nur der Pointer initialisiert, sondern das char[] hat einen definierten Inhalt
und endet auf '\0'.
Klasische Weichei-Programmmierung
Bisschen stört mich das "Mischen" von C und C++.
Wenn es sein muss, dann statt der C-Lib die Entsprechung nach ISO-Standard 1990.
Also für stdio.h -> cstdio.
Einfach mal die Doku durchgucken oder
http://www.cplusplus.com/reference
Ansonsten ist es eine Möglichkeit statt char[] string zu nehmen. Es ist die String-Klasse von Cpp.
Passt gut zu cin, cout und bietet jede Menge guter Methoden zum Stringhandling.
Ich finde diese Methoden besser als die Fnktionen aus cstring.h (aka string.h).
Anstatt char nick [80] also string nick;
Gruss
wori
char* nick ist ein nicht initialisierter Pointer also Teufelszeug und igitte bäh pfui.
Es sei denn man hat bei größeren Projekten Spaß an ausgiebigen Debugsitzungen.
Persönlich bevorzuge ich
char nick [80] = memset(nick,0,sizeof(nick));
Dann ist nicht nur der Pointer initialisiert, sondern das char[] hat einen definierten Inhalt
und endet auf '\0'.
Klasische Weichei-Programmmierung
Bisschen stört mich das "Mischen" von C und C++.
Wenn es sein muss, dann statt der C-Lib die Entsprechung nach ISO-Standard 1990.
Also für stdio.h -> cstdio.
Einfach mal die Doku durchgucken oder
http://www.cplusplus.com/reference
Ansonsten ist es eine Möglichkeit statt char[] string zu nehmen. Es ist die String-Klasse von Cpp.
Passt gut zu cin, cout und bietet jede Menge guter Methoden zum Stringhandling.
Ich finde diese Methoden besser als die Fnktionen aus cstring.h (aka string.h).
Anstatt char nick [80] also string nick;
Gruss
wori
Zuletzt bearbeitet:
[P3D] Crazy_Chris
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 9.451
- Renomée
- 116
- Mein Laptop
- Sony Vaio VPC-CW2S1E/R (14,1", Core i3 330M, GeForce GT 330M, Intel X25-M G2 80 GB)
- Prozessor
- Intel Core i5-750 @ 3.36Ghz (1,18V)
- Mainboard
- Gigabyte GA-P55M-UD2
- Kühlung
- Scythe Mugen 2 Rev. B
- Speicher
- 4x 2GB G.Skill F3-12800CL9D-4GBNQ (DDR3-1600)
- Grafikprozessor
- Gigabyte GV-N570OC-13I (GeForce GTX 570 OC 1280MB GDDR5)
- Display
- Dell UltraSharp 2407WFP
- HDD
- Crucial RealSSD C300 128 GB, Samsung SpinPoint F3 1TB
- Optisches Laufwerk
- LG GGC-H20L SATA *Blu-ray*
- Soundkarte
- Creative Sound Blaster X-Fi Titanium PCIe
- Gehäuse
- Silverstone Temjin TJ08 µATX
- Netzteil
- ELVT NesteQ NA4501 (450 W, Semipassiv)
- Betriebssystem
- Windows 7 und Ubuntu (x64)
- Webbrowser
- Mozilla Firefox
- Verschiedenes
- guckguck :-P
char nick [80] = memset(nick,0,sizeof(nick));
char nick[80] = {0}; tuts auch
oder
char nick [80];
memset(nick,0,sizeof(nick));
Ansonsten würde ich mir mal "new" und "delete" zu Gemüte führen. Sonst stößt man da sehr schnell an Grenzen wenns um Dateien geht.
Zuletzt bearbeitet:
Ähnliche Themen
- Antworten
- 229
- Aufrufe
- 15K
- Antworten
- 9
- Aufrufe
- 2K
- Antworten
- 0
- Aufrufe
- 223