Я делаю упражнение по кодированию, и мне нужно открыть файл данных, который содержит много данных. Это файл .raw. Прежде чем создавать приложение, я открываю файл «card.raw» в текстовом и шестнадцатеричном редакторах. Если вы откроете его в textEdit, вы увидите «bit.ly/18gECvy ˇÿˇ‡JFIFHHˇ€Cˇ€Cˇ¿Vˇƒ» в качестве первой строки. (URL указывает на Рик Ролла как на шутку профессора.)
Итак, я начинаю создавать свое приложение, чтобы открыть тот же файл «card.raw». Я делаю первоначальные проверки, чтобы увидеть, как приложение выводит на консоль тот же «материал», что и при открытии его с помощью TextEdit. Вместо того, чтобы распечатать, я вижу, когда я открываю его с помощью TextEdit (см. Текст выше), он начинает и продолжает распечатывать текст, который выглядит следующим образом:
\377\304 'у\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
Теперь я понятия не имею, как называются «\» и цифры (что мне искать, чтобы узнать больше?), почему он печатает это вместо символов (юникод?), которые я вижу, когда я открываю в TextEdit, или если я могу преобразовать этот вывод в шестнадцатеричный или юникод.
Мой код:
#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;
}
ОБНОВЛЕННЫЙ И УПРОЩЕННЫЙ КОД С ИСПОЛЬЗОВАНИЕМ 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;
}
Вывод частично правильный (вот фрагмент начала):
бит.лы/18gECvy
\377\330\377\340 \221\241\26145\301\321\341 "#&23DE\3616BFRTUe\202CVbdfrtv\222\242 'у\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
Настоящий фрагмент файла card.raw с начала
bit.ly/18gECvy ˇÿˇ‡JFIFHHˇ€Cˇ€Cˇ¿Vˇƒ
ˇƒÖ
!1AQa$%qÅë°±45¡—· "#&23DEÒ6BFRTUeÇCVbdfrtví¢
.rtf
, это будет странно. не используйте textedit для проверки содержимого файла, поскольку он будет преобразовывать необработанные данные .rtf в презентабельную информацию. Откройте терминал иcat /Users/jamesgoldstein/CS50/CS50Week4/CS50Recovery/CS50Recovery/CS50Recovery/test.rtf
, и вы должны увидеть то же самое, что и ваша программа. - person edhurtig   schedule 24.06.2016od -b /Users/jamesgoldstein/CS50/CS50Week4/CS50Recovery/CS50Recovery/CS50Recovery/card.raw
? (возможно, передать это черезless
). Если значения соответствуют вашему выводу, то, я думаю, ваша программа ведет себя правильно; \xxx — восьмеричные управляющие последовательности. - person davmac   schedule 24.06.2016for (int i = 1; fread(output, sizeof(output), 1, fp) != NULL; i++)
немного сомнительна, поскольку переменнаяi
никогда не используется. Предложите:while( fread(output, sizeof(output), 1, fp) )
, так как он будет делать то же самое, без посторонней переменнойi
А если (как предлагает один ответ) прочитать весь файл одним «глотком», то дажеwhile
не понадобится. - person user3629249   schedule 25.06.2016