Dateiöffnen
-
Hi!
Ich hab ein kleines Problem mit dem Dateiöffnen.
Zur Erklärung: ich schreib grad ein Programm, dass zuerst ein Ini-file aufruft, aus diesem Pfad- und Dateinamen ausliest. Im Ini-file stehen die Daten ungefähr so:
path=C:\temp Userfile=User.bin Goupfile=Group.bin usw....
Zum Auslesen hab ich eine Funktion geschrieben, welche die tatsächlich benötigten Daten (also z.B. C:\temp bei path) richtig ausliest und in ein hierfür vorgesehenes Array reinklatscht. Damit die Arrays schön brav abgeschlossen werden, setze ich an die letzte Stelle ein \0. Das funktioniert soweitauch problemlos.
Aber jetzt kommts: verschiedene Funktionen benötigen nun diese Daten um die für das Programm benötigten Binarys auszulesen. Also mach ich ein mittels strcpy und strcat
... strcpy(sUserFilePath, sPathName); strcat(sUserFilePath, sUserFileName); ...
ein neues Array welches z.B. Path mit Userfile kombiniert. Somit erhalte ich den gesammten Pfadnamen. Will ich jetzt aber eine Datei mit fopen aufrufen dann erkennt er den Pfad nicht, da das \0 offensichtlich als Carriage Return erkannt wird...
Ich weiß, dass ich das Problem leicht lösen könnte, wenn ich einfach das Konzept der ini-Datei ändere aber ich würde es trotzdem gerne so lösen.
Hat jemand eine Idee?
lg,
Nat
-
Vergißt Du auch nicht den fehlenden Backslash?
So wie es bislang aussieht hast Du:
strcpy(sUserFilePath, sPathName); // sUserFilePath = C:\temp strcat(sUserFilePath, sUserFileName); // sUserFilePath = C:\tempUser.bin
Solltest Du das nicht so machen?
strcpy(sUserFilePath, sPathName); // sUserFilePath = C:\temp strcat(sUserFilePath, "\\"); // sUserFilePath = C:\temp\ strcat(sUserFilePath, sUserFileName); // sUserFilePath = C:\temp\User.bin
???
-
Hab ich nicht vergessen. Dafür gibts eine eigene Funktion, die abcheckt, ob ob eh die doppelten Backslashes vorhanden sind und diese nötigenfalls ergänzt. Daran kanns nicht liegen.
Das Problem liegt daran, dass, wenn ich den neu gebildeten String testweise mit printf ausgebe, automatisch am Ende eine Zeilenschaltung gemacht wird, so als hätte ich \n mit ausgegeben.
-
Probiers doch aus! setz testweise sUserFilePath[ende-1] auf "\0" und lass es dir wieder ausgeben, bzw. probier aus ob sich die datei dann öffnen lässt.
Danach baust du dir ne funktion, die das "\n" Dynamisch rausschneidet, bzw. mit "\0" überschreibt.
path=C:\temp
Userfile=User.bin
Goupfile=Group.binTja, überleg mal wies im File drinsteht
nämlich so:path=C:\temp\nUserfile=User.bin\nGoupfile=Group.bin\n
Ansonnsten hättest du im Textfile nämlich auch keine zeilenumbrüche.
Beim einlesen wird das halt miteingelesen.
-
Ich ging davon aus das er die INI mit den Windows-Funktionen GetPrivateProfileString usw. ausliest.
Damit hätte er das Problem nicht, allerdings legt er sich dann auf ein Betriebssystem (Windows) fest, was evtl. nicht gewollt ist.
Andersherum: Warum nimmt er dazu eine INI, wenn er sie doch nicht mit den Windows-Funktionen ausliest (INI ist meines Erachtens ein Windows-Relikt).
-
Hepi schrieb:
Warum nimmt er dazu eine INI, wenn er sie doch nicht mit den Windows-Funktionen ausliest (INI ist meines Erachtens ein Windows-Relikt).
Weil das INI Format doch recht praktisch ist?
-
Shade Of Mine schrieb:
Hepi schrieb:
Warum nimmt er dazu eine INI, wenn er sie doch nicht mit den Windows-Funktionen ausliest (INI ist meines Erachtens ein Windows-Relikt).
Weil das INI Format doch recht praktisch ist?
1. das
und
2. weil wir das auf diese Art in der Schule so machen sollen...Apropos: die Funktion, welche die Strings rausschneidet schaut so aus:
void CutString(char sIniString[], char sCompareString[], char sReturnString[]) { for (int i = 0; i < strlen(sIniString)-strlen(sCompareString) && sIniString[i]!='\0'; i++) sReturnString[i]=sIniString[i+strlen(sCompareString)]; sReturnString[i]='\0'; }
-
Hab das Problem gelöst:
sUserFilePath[strlen(sUserFilePath)-1] = '\0';