Чтение общего файла - PullRequest
3 голосов
/ 24 мая 2011

Я делаю программу, которая читает файл из stdin, что-то делает с ним и отправляет в stdout.

В моем нынешнем виде в моей программе есть строка:

while((c = getchar()) != EOF){

, где c - это int.

Однако проблема в том, что я хочу использовать эту программу в исполняемых файлах ELF. И похоже, что внутри исполняемого файла должен быть байт, представляющий EOF для файлов ascii, что приводит к его усечению (поправьте меня, если я ошибаюсь - это только моя гипотеза).

Каков эффективный общий способ сделать это? Я мог бы выкопать документы в формате ELF, а затем просто проверить, что получится в конце. Это было бы полезно, но я думаю, что было бы лучше, если бы я мог применить эту программу к любому виду файлов.

Ответы [ 4 ]

3 голосов
/ 24 мая 2011

С вами все будет в порядке - константа EOF не содержит действительного значения ASCII (обычно это -1).

Например, ниже приведен отрывок из stdio.h в моей системе:

/* End of file character.
   Some things throughout the library rely on this being -1.  */
#ifndef EOF
# define EOF (-1)
#endif
1 голос
/ 24 мая 2011

Вы делаете это правильно.

EOF не является символом. Нет способа c иметь EOF для представления любого байта в потоке. Если / когда c действительно содержит EOF, это конкретное значение происходит не из самого файла, а из базовой библиотеки / ОС. EOF - это сигнал о том, что что-то пошло не так.

Убедитесь, что c является int хотя

Ох ... и вы можете читать из потока под вашим контролем. В отсутствие кода, позволяющего сделать иначе, stdin подвергается «переводу текста», что может быть нежелательно при чтении двоичных данных.

FILE *mystream = fopen(filename, "rb");
if (mystream) {
    /* use fgetc() instead of getchar() */
    while((c = fgetc(mystream)) != EOF) {
        /* ... */
    }
    fclose(mystream);
} else {
    /* error */
}
1 голос
/ 24 мая 2011

Возможно, вы захотите перейти на более низкий уровень и использовать системные функции, такие как open (), close () и read (), таким образом вы можете делать то, что вам нравится, с помощью ввода, так как он будет сохранен в вашем собственном буфере.

0 голосов
/ 24 мая 2011

Из справочной страницы getchar (3):

Символьные значения возвращаются как символ без знака, преобразованный в int.

Это означает, что значение символа, читаемое через getchar, никогда не может быть равно целому числу со знаком, равному -1 Эта маленькая программа объясняет это:

int main(void)
{
        int a;
        unsigned char c = EOF;

        a = (int)c;
        //output: 000000ff - 000000ff - ffffffff
        printf("%08x - %08x - %08x\n", a, c, -1);
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...