2012-01-13 3 views
-1

Привет Я пытаюсь читать этот текст, используя входной файл потока или какой-то:чтение этого текста в C/C++

E^@^@<a^[email protected]^@@^FÌø<80>è^AÛ<80>è ^F \^DÔVn3Ï^@^@^@^@ ^B^VÐXâ^@^@^B^D^E´^D^B^H 
IQRÝ^@^@^@^@^A^C^C^GE^@^@<^@^@@^@@^F.^K<80>è ^F<80>è^AÛ^DÔ \»4³ÕVn3Р^R^V J ^@^@^B^D^E´^D^B^H 
^@g<9f><86>IQRÝ^A^C^C^GE^@^@4a^[email protected]^@@^FÌÿ<80>è^AÛ<80>è ^F \^DÔVn3л4³Ö<80>^P^@.<8f>F^@^@^A^A^H 
IQRÞ^@g<9f><86>E^@^A±,[email protected]^@@^F^@E<80>è ^F<80>è^AÛ^DÔ \»4³ÖVn3Ð<80>^X^@.^NU^@^@^A^A^H 
^@g<9f><87> 

Вот код, который я пытался читать его, но я получаю кучу 0s.

#include <stdio.h> /* required for file operations */ 

int main(int argc, char *argv[]){ 
    int n; 
    FILE *fr; 
    unsigned char c; 
    if (argc != 2) { 
    perror("Usage: summary <FILE>"); 
    return 1; 
    } 

    fr = fopen (argv[1], "rt"); /* open the file for reading */ 

    while (1 == 1){ 
    read(fr, &c, sizeof(c)); 
    printf("<0x%x>\n", c); 
    } 
    fclose(fr); /* close the file prior to exiting the routine */ 
} 

Что случилось с моим кодом? Я думаю, что я не читаю файл правильно.

+0

Что такое кодировка файла? UTF8? Unicode? – rkosegi

+0

Я понятия не имею, как это сделать? – SuperString

+0

Подождите, вы используете 'FILE *' и передаете его в 'read()'? 'read()' принимает 'int fd', если это не какая-то платформа, которая этого не делает? –

ответ

2

ваше: не компилировать для меня, но я сделал несколько исправлений, и это право, как дождь ;-)

#include <stdio.h> /* required for file operations */ 

    int main(int argc, char *argv[]){ 
    int n; 
    FILE *fr; 
    unsigned char c; 
    if (argc != 2) { 
     perror("Usage: summary <FILE>"); 
     return 1; 
    } 

    fr = fopen (argv[1], "rt"); /* open the file for reading */ 

    while (!feof(fr)){ // can't read forever, need to stop when reading is done 
     // my ubuntu didn't have read in stdio.h, but it does have fread 
     fread(&c, sizeof(c),1, fr); 
     printf("<0x%x>\n", c); 
    } 
    fclose(fr); /* close the file prior to exiting the routine */ 
    } 
1

Это не похоже на текст для меня. Поэтому используйте режим "r" для fopen, а не "rt".

Также ^@ представляет '\0', поэтому вы, вероятно, прочитаете кучу нулей в любом случае. Но не ВСЕ нули.

+0

все еще получает 0s? – SuperString

+0

В вашем файле есть нули. Дамп файла с помощью 'hexdump' или' xxd'. –

+0

hexdump/xxd ???? – SuperString

3

Вы с помощью fopen(), чтобы открыть файл, который возвращает FILE * и read() чтобы прочитать его, который принимает int. Вам необходимо либо использовать open(), либо read() вместе, или fopen() и fread(). Вы не можете смешивать их вместе.

Чтобы уточнить, fopen() и fread() Воспользоваться FILE указателей, которые иным способом получить доступ и различные абстракции, чем дескрипторы прямолинейных вверх файлов. open() и read() используют «необработанные» файловые дескрипторы, которые являются понятием, понятным операционной системе.

Не имея отношения к ошибке программы здесь, ваш fclose() вызов также должен совпадать. Иными словами, fopen(), fread() и fclose(), или open(), read() и close().

+0

Я предполагаю, что это опечатка, поскольку код даже не компилируется, как опубликовано. 'open' будет неопределенным идентификатором, поскольку его заголовок не включен, а затем параметр будет неправильным и не может быть неявно преобразован. –

+0

@BenVoigt: Это может быть правильно, теперь, когда вы упомянули об этом. Хотя, даже с 'fread()' then, он должен, по крайней мере, функционировать и печатать правильные вещи; он просто не закончил бы, что с «1 == 1» и все. Но да, возможно, ты прав. Возможно, OP может просветить нас. –

Смежные вопросы