2017-09-13 146 views
0

我想在要掃描的文檔類型從.ppm格式的文件,該文件是圖像文件,但遵循以下數據結構PPM掃描和打印

P3 
4 4 
255 
255 255 0 255 255 0 255 255 0 255 255 0 
255 255 0 255 0 0 128 128 128 255 255 0 
255 255 0 0 255 0 0 0 255 255 255 0 
255 255 0 255 255 0 255 255 0 255 255 0 

每3點的整數標記的列,以便所述第一3行後,這標誌着第二行所示的4x4表的模式。

我的第一步是讀取這樣的文件,其中高度和寬度可以變化,然後使用scanf和printf以確切格式重新打印。

我在此嘗試如下:

scanf(" %d%d %d", &width, &height, &depth); 
printf("P3\n%d %d\n %d\n", width, height, depth); 

    while(scanf("%c", &input) >= 1) { 
     for (int i = 0; i < width; i++) { 
      printf("%c %c %c ", input, input, input); 
      for (int j = 0; j < height; j++) { 
       printf("\n"); 
      } 
     } 
    } 

任何想法,我缺少的是什麼?

+0

內循環多次打印換行。奇怪。 –

+1

轉到第一行代碼。 「%d」之前的第一個空格不會跳過「」P3「文本。第二個空格是無關緊要的,因爲大多數格式說明符(包括'%d')總是跳過空行,如newline(一個共同的陷阱:不是'%c')。但是我很困惑,爲什麼隨後在提供整數數據時使用'%c'。當輸入爲「」255「格式時,」%c「將讀爲」2「。 –

回答

0

有一些代碼中的錯誤的:

  1. 您只需掃描一次input。因此,所有的像素都將具有相同的值。你可能想在內部循環中調用scanf
  2. 格式說明符%c只能讀取一個字符而不能讀取數字。即使像素值的範圍適合一個字節,也應該使用%d。如上所述,內層循環除了換行之外什麼也不打印。這屬於外部循環。
  3. 應在內循環中調用print,但使用不同的參數,除非您只想寫入黑白圖像:printf("%d %d %d ", r, g, b);。同樣,您需要使用%d而不是%c
  4. 正如另一條評論所述,您需要跳過標題中的「P3」。您可以將您的第一行修改爲scanf("%*s %d %d %d", &width, &height, &depth);。 '%* s'讀取一個字符串而不將其分配給一個變量。
+0

你能看到我的更新版本嗎? – compute

+1

@compute:不,據我所見,你的問題還沒有更新。 –