Buchstabenweise in String schreiben
Hallo,
ich habe in dem Code eine Schleife die Buchstabenweise ein Text Datei verarbeitet und ich möchte bei jedem Durchlauf ein neuen Buchstaben in de string1 schreiben.
Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .
Könnt Ihr mir bitte weiter helfen?
P.S.: Einen Überlaufschutz habe ich noch nicht eingebaut (ich werde bei einen zu hohen counter1 mit einer Fehlermeldung aussteigen ; -)
ich habe in dem Code eine Schleife die Buchstabenweise ein Text Datei verarbeitet und ich möchte bei jedem Durchlauf ein neuen Buchstaben in de string1 schreiben.
Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .
Könnt Ihr mir bitte weiter helfen?
P.S.: Einen Überlaufschutz habe ich noch nicht eingebaut (ich werde bei einen zu hohen counter1 mit einer Fehlermeldung aussteigen ; -)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
FILE *fp;
char tmp1;
char switch1 = '0';
char string1[255] = "";
size_t counter1 = '0';
fp = fopen ("config.conf", "r");
if(fp == NULL) {
puts("ERROR: Konfiguration konnte nicht eingelesen werden, ueberpruefen Sie die config.conf Datei");
return 1;
}
else {
//List Buchstabenweise die config datei
while((tmp1 = fgetc(fp)) !=EOF) {
//Die Leerzeichen löschung wird mit " an oder abgeschaltet
if('"' == tmp1) {
if(switch1 == '0'){
switch1 = '1';
}
else {
switch1 = '0';
}
}
//Leerzeichen löschung auser wenn " switch1 an ist und " zeichen löschen
if (!(((tmp1==' ') || (tmp1=='\t')) && (switch1=='0') || (tmp1=='"'))){
printf("%c", tmp1);
//variablen name einlesen
string1[counter1] = tmp1;
counter1++;
}
}
string1[counter1] = '\0';
printf("%s", string1);
fclose (fp);
return 0;
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 279091
Url: https://administrator.de/contentid/279091
Ausgedruckt am: 08.11.2024 um 19:11 Uhr
20 Kommentare
Neuester Kommentar
Zitat von @kunert0345:
Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .
Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .
Was genau funktioniert denn nicht?
Könnt Ihr mir bitte weiter helfen?
Nur wenn du genauer sagst, was denn genau nicht funktioniert.
P.S.: Einen Überlaufschutz habe ich noch nicht eingebaut (ich werde bei einen zu hohen counter1 mit einer Fehlermeldung
aussteigen ; -)
Das soltlest Du gleich einbauen., daß wenn counter >254 wird, Du mit einer Fehlermeldung aussteigst.
> printf("\n%s", string1);
> string1[counter1] = '\0';
> printf("%s", string1);
Du solltest erst den String mit 0 terminieren, bevor Du ein printf drauf losläßt. Sinnvoller wäre es, string1 einfach mit nullen zu initialisieren, dann kann man das späte rnicht mehr vergessen.
lks
Zitat von @kunert0345:
Inhalt der Datei ist:
Ausgabe:
Ich lese quelle ein und das bis das = kommt was es als Variablen Namen deklariert denn ich dann bei einer case Auswahl benutze.
Dann füttere ich die Variable mit dem Nachfolgenden Wert bis ein Enter Zeichen kommt.
Inhalt der Datei ist:
quelle = "C:\test test"
quelle=C:\test test
Ich lese quelle ein und das bis das = kommt was es als Variablen Namen deklariert denn ich dann bei einer case Auswahl benutze.
Dann füttere ich die Variable mit dem Nachfolgenden Wert bis ein Enter Zeichen kommt.
Und was ist das Problem?
lks
Hallo kunert0345,
habe das jetzt mal nachvollzogen und die Ausgabe sieht genau so aus, wie von dir gewünscht.
Eine mögliche Fehlerquelle ist natürlich, dass deine Quelldatei keine ASCII Datei ist und der Zeichensatz sich mit der Verarbeitung als ASCII Text beißt. Um das aus der Ferne festzustellen, bräuchte ich aber eine Kristallkugel ...
Grüße
rubberman
habe das jetzt mal nachvollzogen und die Ausgabe sieht genau so aus, wie von dir gewünscht.
Eine mögliche Fehlerquelle ist natürlich, dass deine Quelldatei keine ASCII Datei ist und der Zeichensatz sich mit der Verarbeitung als ASCII Text beißt. Um das aus der Ferne festzustellen, bräuchte ich aber eine Kristallkugel ...
Grüße
rubberman
Langsam, langsam! So wird es nur noch konfuser. Was soll dein Endergebnis sein? Du redest von Variablennamen etc...
Deine Ausgangszeile ist
Verstehe ich das nun richtig, dass du 2 Pointer haben willst?
Einer der auf
als nullterminierten String zeigt und einer der auf
als nullterminierten String zeigt?
Deine Ausgangszeile ist
quelle = "C:\test test"
Einer der auf
quelle
als nullterminierten String zeigt und einer der auf
C:\test test
als nullterminierten String zeigt?
Zitat von @kunert0345:
Was soll dein Endergebnis sein?
string1 soll mit dem Inhalt von tmp1 (Was bei jedem Schleifendurchlauf ein neues Zeichen enthält ) gefüllt werden.
Den Rest denn ich mit dem Leerzeichen und Enter gemeint habe muss ich noch programmieren aber wie gesagt ich bekomme es ja nicht
mal hin mit meinen string zu füllen.
Was soll dein Endergebnis sein?
string1 soll mit dem Inhalt von tmp1 (Was bei jedem Schleifendurchlauf ein neues Zeichen enthält ) gefüllt werden.
Den Rest denn ich mit dem Leerzeichen und Enter gemeint habe muss ich noch programmieren aber wie gesagt ich bekomme es ja nicht
mal hin mit
string1[counter1] = tmp1;
Ich vestehe jetzt Dein problem nicht. Der Stript wird doch gefüllt.
lks
mach da einfach mal ein printf ("%c %d\n", tmp1, counter1); daraus. Dann siehst Du, was da passiert.
lks
Eben. '0' ist Zeichen 48.
lks
PS: Ist mir aber beim durchauen Deines Codes aber zuerst nciht aufgefallen.
lks
Zitat von @kunert0345:
und wenn ich nur einbaue bekomme ich
jetzt versteh ich garnichts mehr ???
und wenn ich nur
printf ("%c\n", counter1);
> 0
> 1
> 2
> 3
>
jetzt versteh ich garnichts mehr ???
Ja, weil 48 der Ascii-Code von dem Zeichen '0' ist und nicht die null selbst.
lks
PS: Du sollest Dich mal über Zeichenkodierung datentype, Darstellung der Datentypen und den Unterschied zwischen Darstellg und und Repräsentation Gedanken machen. Vergleiche auch c'est ne pas une pipe von René Magritte.
Jepp. Ich hoffe Du hast bei der Fehlersuche was gelernt. Ich halte nämlich nichts davon einfach die fertige Lösung hinzuschreiben, weil dann die Leute den Fehler nicht sehen und dann auch ncihts daraus lernen. Der Hinweis auf den Datentyp sollte normalerweise reichen, um den Fehelr zu finden. Ich habe den übrigens auch erst gesehen, nachdem Du oben dieAusgabe des Statements gepostet hast, den ich hingeschrieben habe.
Danke Lochkartenstanzer und rubberman für Eure Engelsgeduld mit mir )
Keine Ursache.
Du slltest Dir eventuell ein lehrbuch zu C holen udn das dann ducchackern. Un noch zusätzlich eine C/C++-referenz zum nachschlagen
lks
Grundsätzlich gebe ich ja lks Recht. Vorgekauter Code hilft nur wenig. Da das hier aber bereits gelöst ist, mal ein Vorschlag mit voll durchkommentiertem Code (natürlich in der Hoffnung dass die Kommentare gelesen werden und der Code verstanden wird). Ich bin in meinem Test davon ausgegangen, dass irgendwo folgende Zeile existiert:
Ich benutze Funktionen, die ich bereits ins Netz gestellt habe und (da Administrator.de Code immer in voller Länge anzeigt) hier nicht noch mal kopieren will. Also kopiere dir die Funktionen von diesen Links und hänge sie an den Code an:
ReadLineCopy
SplitAlloc und SplitFree
Trim
Schau mal, ob das etwas ist, was dem nahe kommt, was du suchst.
Grüße
rubberman
quelle = "C:\test test"
ReadLineCopy
SplitAlloc und SplitFree
Trim
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef PATH_MAX
#define PATH_MAX 260
#endif // PATH_MAX
int ReadLineCopy(FILE *const pFile_in, char *const szLine_inout, const size_t cSize_in, size_t *const pcchLength_out);
int SplitAlloc(const char *const str, const char *const delims, const int mergeDelims, const size_t maxTok, char ***const pTokens, size_t *const pTokCount);
void SplitFree(char ***const pTokens, const size_t tokCount);
int Trim(char *const str, const char *const charlist, const unsigned mode, size_t *const pLen);
int main(void)
{
const char filename = "config.conf", //Dateiname
delims = "=", // Trennzeichen in der Zeile
trimlist = " \t\"", // voran- und nachgestellte Leerzeichen, Tabs und Anführungszeichen sollen erntfernt werden
searchstr = "quelle"; // Eintrag, nach dem gesucht werden soll
FILE *fp = NULL; // File-Pointer
char line[1024] = {0}, // Puffer für den Inhalt einer gelesenen Zeile
**tokens = NULL, // Pointer auf die Teilstrings der Zeile
sourcepath[PATH_MAX] = {0}; // gelesener Wert für die "quelle"
size_t tokenscount = 0, // Anzahl erzeugter Teilstrings
sourcelen = 0; // Länge des gelesenen Pfades
if(!(fp = fopen(filename, "r"))) // Datei zum Lesen öffnen
{
puts("ERROR: Konfiguration konnte nicht eingelesen werden, ueberpruefen Sie die config.conf Datei");
return 1;
}
while(ReadLineCopy(fp, line, sizeof(line), NULL) == 0) // Zeilenweise aus der Datei lesen
{
if (SplitAlloc(line, delims, 0, 2, &tokens, &tokenscount) == 0) // Am ersten = in 2 Teilstrings splitten und in ein Array kopieren
{
if (tokenscount == 2 // Wenn die Zeile min. ein = beinhaltet hat ...
&& Trim(tokens, trimlist, 1 | 2, NULL) == 0 // Umschließende Leerzeichen und/oder Tabs und/oder Anführungszeichen vom ersten Teilstring entfernen
&& Trim(tokens[1], trimlist, 1 | 2, &sourcelen) == 0) // Umschließende Leerzeichen und/oder Tabs und/oder Anführungszeichen vom zweiten Teilstring entfernen
{
printf("'%s' '%s'\n", tokens, tokens[1]); // Testausgabe
if (strcmp(tokens, searchstr) == 0 && sourcelen < PATH_MAX) // Wenn der erste Teilstring "quelle" ist und der zweite Teilstring in sourcepath passt, ...
strncpy(sourcepath, tokens[1], sourcelen + 1); // ... zweiten Teilstring incl. Nullterminierung nach sourcepath kopieren
}
SplitFree(&tokens, tokenscount); // Die durch SplitAlloc reservierten Speicherbereiche freigeben
}
}
fclose(fp); // Datei schließen
printf("\n\nResultat:\n%s\n", sourcepath); // Gefundenen Pfad ausgeben
return 0;
}
Grüße
rubberman