2017-02-20 12 views
2
/*Title: P3.c 
Location: ~/csc1710/P3/P3.c 
Class: CSC1710 
Name: Emily 
Date: 02-18-2017 

This program is meant to convert a colored image to black and white.*/ 

#include<stdio.h> 
#include <string.h> 

int main(void) 
{ 
    int height, width; 
    char red; 
    char green; 
    char blue; 
    char imageType[3]; 
    char comment[256]; 
    char newlinechar; 
    int mcc; 
    unsigned char color; 

    //scan and print for image type 
    fscanf(stdin,"%[^\n]%c",imageType,&newlinechar); 
    strncpy(imageType,"P2",3); 
    fprintf(stdout,"%s\n",imageType); 

    //scan and print for comment 
    fscanf(stdin,"%[^\n]%c",comment,&newlinechar); 
    strncpy(comment,"#EMILY MORAN Black and White Conversion Routine, Version 0.1",256); 
    fprintf(stdout,"%s\n",comment); 

    //scan and print for height and width 
    fscanf(stdin,"%d %d",&width,&height); 
    fprintf(stdout,"%d %d\n",width,height); 

    //scan and print for max color code 
    fscanf(stdin,"%d",&mcc); 
    fprintf(stdout,"%d\n",mcc); 

    //while loop for RGB numbers 
    while(fscanf(stdin," %c", ,&red)!=EOF){ 
     fscanf(stdin,"%c",&green); 
     fscanf(stdin,"%c",&blue); 

     color =(unsigned char)0.3*red+0.5*green+0.2*blue; 

     fprintf(stdout,"%hhu\n",color); 
    } 

    return(0); 
    } 

上記は私のCSCクラスのプログラミングプロジェクトです。プロジェクトの最初の部分は、整数値を使用してppmイメージをpgmにグレースケール化することでした。この部分は私のイメージエディタで私にとって完璧に動作します。%C whileループで改行を維持していますか?

第2の部分は、これらの整数値を文字にすることにより、より少ないスペースを使用することでした。しかし、私は今、画像が正しく表示されない問題に遭遇しています。まだグレースケールではありますが、最初の画像と同じ画像ではありません。私の教授は今朝、ループが新しい行をスキップしていないというバグについて話しましたが、whileループでfscanfを編集してnewImageおよびコメントとして表示しようとすると、コンパイラーはセグメンテーションの失敗を訴えます。

ところで、プログラムに.ppmファイルを入力し、新しい.pgm値を出力しています。

誰かが私のコードでこの問題を見るのを助けることができますか?ありがとう!あなたは新しい色データを出力しているとき、あなたはそれが連続ブロックでなければなりません\n文字

fprintf(stdout,"%hhu\n",color); 

含めている

+0

「これらの整数値を文字にする」とは、バイナリデータとして書き込むことですか?改行とバイト値10の違いをどうやって分かりますか?何かここではあまり一致しません。とにかく、バイナリデータを使用している場合は、 'fscanf'を使って読み込みません(おそらく' getc'を使用します)。 – hyde

+1

デバッガ(gdbのような)を使用している場合は、セグメンテーションフォールトをどのラインで取得しているのかを教えてください –

+0

どの入力を使用していますか? – melpomene

答えて

2

。だから、私の教授と私がバグを発見し、それが最後にunsigned char型がcharきのすべきことをした、不思議に思っている人のために、この

fprintf(stdout,"%hhu",color); 
+0

ファイルの先頭のP2も、出力しているpgmファイルの種類の正しいファイルタイプであるため、P5に変更する必要があります。 –

+0

私の教授と私は不思議に思っている人のために、このバグを見つけました。そして、最後の無署名のcharはcharだったはずです。あなたの助けをありがとう! – Emily

0

ようにする必要があります。あなたの助けをありがとう!

関連する問題