Ich mache eine Codierung Übung und ich muss eine Datei öffnen, die viele Daten enthält. Es ist eine RAW-Datei. Bevor ich meine App erstelle, öffne ich die 'card.raw' Datei in einem Texteditor und in einem Hexeditor. Wenn Sie es in TextEdit öffnen, sehen Sie in der ersten Zeile "bit.ly/18gECvy ÿ JFIFHH € C € C". (Die URL verweist auf Rick Roll als einen Witz des Professors.)C fopen und fgets, die seltsame Zeichen anstelle des Dateiinhalts zurückgeben
Also fange ich an, meine App zu bauen, um die gleiche 'card.raw' Datei zu öffnen. Ich mache erste Überprüfungen, um zu sehen, dass die App die gleichen "Sachen" auf der Konsole ausgibt, als wenn ich sie mit TextEdit öffne. Anstatt zu drucken, sehe ich, wenn ich es mit TextEdit öffne (siehe den Text oben), es beginnt und druckt weiter Text, der so aussieht:
\ 377 \ 304 'u \ 204 \ 206 \ 226 \ 262 \ 302 \ 3227 \ 205 \ 246 \ 266 \ 342GSc \ 224 \ 225 \ 245 \ 265 \ 305 \ 306 \ 325 \ 326Wgs \ 244 \ 346 (w \ 345 \ 362 \ 366 \ 207 \ 264 \ 304 \ 223 \ 227 \ 2678H \ 247 \ 250 \ 343 \ 344 \ 365 \ 377 \ 304
Jetzt habe ich keine Ahnung, was das '\' und die Nummern heißen (nach was suche ich, um mehr zu lesen?), Warum es das stattdessen druckt . das Zeichen (? Unicode) ich sehe, wenn ich in TextEdit öffnen, oder wenn ich diese Ausgabe verhexen oder Unicode umwandeln kann
Mein Code ist:
012.351.#include <stdio.h>
#include <string.h>
#include <limits.h>
int main(int argc, const char * argv[]) {
FILE* file;
file = fopen("/Users/jamesgoldstein/CS50/CS50Week4/CS50Recovery/CS50Recovery/CS50Recovery/card.raw", "r");
char output[LINE_MAX];
if (file != NULL)
{
for (int i = 1; fgets(output, LINE_MAX, file) != NULL; i++)
{
printf("%s\n", output);
}
}
fclose(file);
return 0;
}
AKTUALISIERT & SIMPLIFIED Code fread()
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
FILE* fp = fopen("/Users/jamesgoldstein/CS50/CS50Week4/CS50Recovery/CS50Recovery/CS50Recovery/card.raw", "rb");
char output[256];
if (fp == NULL)
{
printf("Bad input\n");
return 1;
}
for (int i = 1; fread(output, sizeof(output), 1, fp) != NULL; i++)
{
printf("%s\n", output);
}
fclose(fp);
return 0;
}
Ausgang ist teilweise richtig (hier ist ein Ausschnitt von Anfang):
bit.ly/18gECvy
\ 377 \ 330 \ 377 \ 340 \ 221 \ 241 \ 26145 \ 301 \ 321 \ 341 \ "# & 23DE \ 3616BFRTUe \ 202CVbdfrtv \ 222 \ 242 ' u \ 204 \ 206 \ 226 \ 262 \ 302 \ 3227 \ 205 \ 246 \ 266 \ 342GSc \ 224 \ 225 \ 245 \ 265 \ 305 \ 306 \ 325 \ 326Wgs \ 244 \ 346 (w \ 345 \ 362 \ 366 \ 207 \ 264 \ 304 | \ 223 \ 227 \ 2678H \ 247 \ 250 \ 343 \ 344 \ 365 \ 377 \ 304 = \ 311 \ 345 \ 264 \ 352 \ 354 7 \ 222 \ 315 \ 306 \ 324 + \ 342 \ 364 \ 273 \ 274 \ 205 $ z \ 262 \ 313g- \ 343wl \ 306 \ 375My:} \ 242o \ 210 \ 377 3 (\ 266l \ 356 \ 307T \ "2 \ 377 \ 267 \ 212 \ P \ 2218 \ 344
Actual card.raw Datei snippet Anfang
bit.ly/18gECvy ÿ ‡ JFIFHH € C € C¿Vƒ
ƒÖ
! 1AQa $% QAe ° ± 45¡- · "# & 23DEÒ6BFRTUeÇCVbdfrtví ¢
Sie sehen aus wie Escape-Sequenzen für Sonderzeichen – edhurtig
Auch, weil dies eine '.rtf' Datei ist, wird es seltsam sein. Verwenden Sie nicht Textedit, um den Inhalt der Datei zu verifizieren, da die RAW-Daten in vorzeigbare Informationen konvertiert werden. Öffnen Sie Terminal und 'cat/Benutzer/jamesgoldstein/CS50/CS50Week4/CS50Recovery/CS50Recovery/CS50Recovery/test.rtf' und Sie sollten das gleiche sehen, was Ihr Programm tut – edhurtig
Die RTF-Datei war ein Test, die eigentliche Datei ist .raw. Ich habe gerade den Code korrigiert. –