PutC дает ошибку сегментации? - PullRequest
0 голосов
/ 30 сентября 2011

Следующий код дает ошибку сегментации .... Почему ????? событие с помощью fputc

Я думаю, что может быть глупая ошибка, которую я не могу получить ... но у меня нет времени.

Пожалуйста, помогите ...

   #include <stdio.h>

    int main () {

  //      system("sudo openssl enc -base64 -in file.txt -out file.txt.enc");

    FILE *fp,*fq;
    char ch;

    fp = fopen("file.txt.enc","r");
    fq = fopen("output.txt","w");

    while( (ch=fgetc(fp)) != EOF)
            putc(ch,fq);

    return 0;

    }

Ответы [ 5 ]

4 голосов
/ 30 сентября 2011

Возможно, один из ваших fopen вызовов не удался.Вы не удосужились проверить, удалось ли им это сделать.

При сбое fopen возвращается нулевой указатель.Если вы попытаетесь использовать это впоследствии, ваша программа, скорее всего, будет бомбить.

Затем вам придется исправить ошибку, описанную Благовестом, и вам, конечно, придется закрыть файлы.

3 голосов
/ 30 сентября 2011
  1. Вы должны объявить ch как int. В противном случае обработка файла остановится, когда появится символ ÿ . char может принимать только 256 различных значений, что недостаточно для 256 различных символов + символа EOF. EOF равно -1, что эквивалентно 4,294,967,295 при обработке как int, но эквивалентно 255 при обработке как char. Если ваш входной файл содержит символ ÿ (по существу, -1 или 255 при обработке как signed), оператор ch == EOF станет истинным, и ваш цикл while прервется. Это не имеет ничего общего с вашей ошибкой 1023 *, но, тем не менее, важно ...

  2. Если ваша программа дает сбой, она пытается прочитать / записать в указатель NULL, потому что входной файл не может быть прочитан (не существует) или файл вывода не может быть записан ( защита от записи).

Попробуйте:

#include <stdio.h>

int main () {

    FILE *fp,*fq;
    int ch;

    if( (fp = fopen("file.txt.enc","r")) == NULL)
        return 1;

    if( (fq = fopen("output.txt","w")) == NULL)
        return 1;

    while( (ch=fgetc(fp)) != EOF)
        putc((char) ch, fq);

    return 0;

}
2 голосов
/ 30 сентября 2011

fgetc возвращает int, а не char.Цель этого - вернуть EOF и отличить его от прочитанного символа.

Просто объявите ch как int.

0 голосов
/ 30 сентября 2011

Проверьте это и прочитайте мой ответ http://www.cplusplus.com/reference/clibrary/cstdio/fgetc/

     Fgetc() \\ returns a signed int value

и вы объявили ch как char, сделайте его как int и попробуйте. это будет работать Возможно, вам нужно проверить, что на самом деле вам возвращает fopen, может быть, потому что fopen не удалось. он работает нормально на моем GCC

0 голосов
/ 30 сентября 2011

ch должно быть целым числом.См man fgetc и man putc.

...