質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1179閲覧

irfanviewで書き出したpgmファイルの再配置。

KRoNe_9

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/05/20 13:29

編集2018/05/20 13:31

前提・実現したいこと

プログラミング初心者です。
数字をirfanviewでグレースケールで書きだしたのですが横文字70制限のためこのように書き出されました。
このpgmファイルを読み込み正しいxとyに再配置し書き出したいのですがどのようなプログラムを組めばよいかわかりません。

もしくは行の制限のない変換ソフトを教えていただけると幸いです。
使っている言語はCです。

該当のソースコード

P2 # Created by IrfanView 2339 3307 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255                ~                ~ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/05/20 13:46

上記例では2339x3307の画像のようですが、その次の行以降の数字の数は画像サイズからわかる総pixcel数と一致しそうですか?
KRoNe_9

2018/05/20 13:53

総行数が482827、一行当たり大体数字が16個なので一致すると思います。
y_waiwai

2018/05/20 22:30

どういう結果になればいいのでしょうか
KRoNe_9

2018/05/20 23:33

今16~17×482827で表示されているものを2339×3307で表示できるようにしたいと考えています
y_waiwai

2018/05/21 04:28

「表示」すればいいのでしょうか?
y_waiwai

2018/05/21 04:41

なにをするためにそうしたいのか?というのを説明してくれませんか
KRoNe_9

2018/05/21 05:31

説明不足で失礼しました。このpgmファイルは数字をグレースケールで書き出したものです。正しい配列に、並べかえたあと四行ほどピックアップしピックアップした行から数字を判別させようと思ったのですが最初の段階でつまづいてしまいました。
guest

回答3

0

C でテキスト処理をするのは苦行でしかないので ruby で書きました。
ruby を知らなくても大体読めると思います。
エラーチェックは省略しています。
あと動作確認もしてないです。

ruby

1# 第一引数に pgm ファイルを指定する 2# 第二引数に出力ファイルを指定する 3input = ARGV.shift 4output = ARGV.shift 5 6# 入力ファイルを開く 7io = open(input, "r") 8 9# コメントを飛ばして一行読み込む便利メソッド 10def io.read_line 11 until self.gets.nil? 12 return $_.trim unless $_.start_with?('#') 13 end 14 nil 15end 16 17# ヘッダ読みこみ 18format = io.read_line # 本当は "P2" であることのチェックが必要 19width, height = io.read_line.split.map(&:to_i) 20max_value = io.read_line 21 22# ピクセルデータ取得 23pixels = [] 24until io.eof? 25 line = io.read_line 26 break if line.nil? 27 pixels << line.split.map(&:to_i) 28end 29 30io.close 31 32pixels = pixels.flatten 33 34# 本当は pixels.size == width * height であることのチェックが必要 35 36# 出力ファイルに書き出す 37open(output, "w") do |out| 38 out.puts format 39 out.puts "#{width} #{height}" 40 out.puts max_value 41 # ピクセルデータ書き出し 42 pixels.each_slice(width) do |scanline| 43 out.puts scanline.join(' ') 44 end 45end 46

投稿2018/05/22 17:15

pute

総合スコア134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

https://wandbox.org/permlink/SzJ55T77lushcySA

こんなやつでどうでしょうか。main関数をいじってstringstreamじゃなくてfstreamに書き換えてくださいな。

cpp

1#include <iostream> 2#include <sstream> 3#include <string> 4int proc_main(std::istream& is, std::ostream& os) 5{ 6 std::string pn; 7 if(!std::getline(is, pn)) return 1; 8 if("P2" != pn) return 2; 9 std::string tmp; 10 if(!std::getline(is, tmp)) return 3; 11 if(tmp.empty() || '#' != tmp[0]) return 4; 12 std::string size; 13 if(!std::getline(is, size)) return 5; 14 const auto width = std::size_t(std::stoul(size.substr(0, size.find_first_of(' ')))); 15 const auto height = std::size_t(std::stoul(size.substr(size.find_first_not_of(' ', size.find_first_of(' '))))); 16 for( 17 std::size_t i = 0, j = 0; 18 [&is](std::string& buf) -> std::istream& { 19 while(auto& re = std::getline(is, buf)) if(buf.empty() || '#' != buf[0]) return re; 20 return is; 21 }(tmp); 22 ){ 23 for( 24 std::size_t pos = 0, pre_pos = 0; 25 std::string::npos != pre_pos; 26 pre_pos = (std::string::npos == pos) ? pos : tmp.find_first_not_of(' ', pos) 27 ){ 28 pos = tmp.find_first_of(' ', pre_pos); 29 if(0 != j) os << ' '; 30 os << tmp.substr(pre_pos, pos - pre_pos); 31 if(++j == width){ 32 if(++i == height){ 33 os << std::flush; 34 return 0; 35 } 36 j = 0; 37 os << std::endl; 38 } 39 } 40 } 41 os << std::flush; 42 return 0; 43} 44constexpr auto input = R"(P2 45# Created by IrfanView 467 4 47255 172 9 4831 7 9 14 49221 187 1 500 92 33 7 51182 21 37 5222 3 5 71 5392 23 143 5422 5 7 21)"; 55int main() 56{ 57 std::istringstream iss(input); 58 return proc_main(iss, std::cout); 59}

投稿2018/05/21 04:53

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/05/23 01:35

C言語とのことでしたが、Cは文字列操作するのに全く向かない言語なのでC++で書いています。ある程度エラーチェックもかけています。
guest

0

お二方ありがとうございます。
Cで自分なりに書いてみました。
pgmファイルをtxtに変えて読み込みグレースケールをモノクロスケール変換し別のtxtに書き込むまでしてみたのですが実行はできたもののどうもうまくいっている気がしません。
初心者のとても汚いプログラムかもしれませんがご容赦ください。

#include <stdio.h> #include <stdlib.h> #define n1_file "4-1.txt" #define n2_file "4-2.txt" int main(void){ FILE *fp; FILE *ip; int n,m; int i,j; float **matrix; fp = fopen(n1_file, "r"); ip = fopen(n2_file, "w"); fscanf(fp, "%d", &n); fscanf(fp, "%d", &m); matrix = (float **)malloc(sizeof(float *) * m); if (matrix==NULL) exit(1); for (i=0; i<m; i++) { matrix[i] = (float *)malloc(sizeof(float) * n); if (matrix[i]==NULL) exit(1); } for (i=0; i<n; i++) { for (j=0; j<m; j++) { fscanf(fp, "%f", &matrix[i][j]); fprintf(ip,"%.0f ", matrix[i][j]/255); } } fclose(fp); fclose(ip); return 0; }

投稿2018/05/23 06:29

KRoNe_9

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/05/23 07:21

>matrix[i][j]/255 何がしたいのか謎。なぜに元の数値に変換を・・・? あとコメントに対する対策がなされていないので意図したとおりには動かないでしょう。 >数字を判別 が最終目的とのことでしたが、ということでしたら大津のアルゴリズムで二値化するべきではないですか? そしてそうなるともうOpenCVとかを使うべきように思えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問