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

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

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

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

解決済

2回答

1733閲覧

真っ白なPDFファイルが出てきてしまうのを直したい

Cobalt

総合スコア10

C

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2016/01/09 05:25

編集2016/01/09 05:40

###前提・実現したいこと
text2pdfというものを改変し、「1行毎に文字を控えて」そのあと、「1行分の文字を出力させる」という動作を行おうとしたのですが、何度やっても真っ白なページのPDFしか出力されず困っています。これを修正し、「文字が出力されるように」したいのです。

###発生している問題・エラーメッセージ
エラーメッセージはなく、出力が真っ白なページになっている

###ソースコード

void WritePages(){ int atEOF = 0; int atFF; int atBOP; long beginstream; int lineNo, charNo; int ch, column; int padding, i; int y = 0; //strを控える手助け char str[1024]; //各行の文字を控える 文字数はcols分にする 参考サイトhttp://9cguide.appspot.com/14-02.html 12/23アクセス int x = 0; int z = 0; while (!atEOF) { beginstream = StartPage(); column = 1; while (column++ <= columns) { atFF = 0; atBOP = 0; lineNo = 0; while (lineNo++ < lines && !atEOF && !atFF) { str[x] = '('; x = x + 1; //writestr("("); charNo = 0; while (charNo++ < cols && (ch = getc(infile)) != EOF &&!(ch == FF && doFFs) && ch != '\n') { if (ch >= 32 && ch <= 127) { if (ch == '(' || ch == ')' || ch == '\\') str[x] = '\\'; x = x + 1; //配列に控えず書き込む //writestr("\\"); sprintf(buf, "%c", (char)ch); str[x] = buf[0]; x = x + 1; //配列に文字を保存する、writestr(buf);から変更 } else { if (ch == 9) { padding = tab - ((charNo - 1) % tab); for (i = 1; i <= padding; i++) str[x] = ' '; x = x + 1; //配列に控えず書き込む、writestr(" ");から変更 charNo += (padding - 1); } else { if (ch != FF) { /* write \xxx form for dodgy character */ sprintf(buf, "\\%.3o", ch); for (y = 0; y < 4; y++){ str[x] = buf[y]; x = x + 1; //まとめて出力されたものを1文字ずつ配列に書き込む、\\%.3o=「「3ケタ」の8進数」。writestr(buf);から変更。 } } else { /* don't print anything for a FF */ charNo--; } } } } str[x] = ')'; x = x + 1; str[x] = '\''; x = x + 1; str[x] = '\n'; x = x + 1; //writestr(")'\n");から変更、実は3文字分。 str[x] = '\0'; //x=x+1は最後の文字なので行わない。 writestr(str); x = 0; //配列に控えた分をここでPDFファイルとして出力 /* messy stuff to handle formfeeds. Yuk! */ if (ch == EOF) atEOF = 1; //EOF=ファイルを読み切ったら ループ全体の終了! if (ch == FF) atFF = 1; //改ページを見つけたら atFFへ if (lineNo == lines) atBOP = 1; //1ページぎりぎりまで文字を書いたら atBOPへ if (atBOP) { ch = getc(infile); if (ch == FF) ch = getc(infile);//1文字飛ばしの必要があるか(1ページが無駄にならないように) if (ch == EOF) atEOF = 1; else ungetc(ch, infile); //適切な改ページ位置なら何もしない! } else if (atFF) { ch = getc(infile); if (ch == EOF) atEOF = 1; else ungetc(ch, infile); } } if (column <= columns) { sprintf(buf, "1 0 0 1 %d %d Tm\n", (pageWidth / 2) + 25, pageHeight - 40); writestr(buf); } } EndPage(beginstream); } }

###補足情報(言語/FW/ツール等のバージョンなど)
言語は「C言語」です。
開発者コマンド プロンプト for VS2013 を使ってコンパイルしました。
手を加えたのは上記のWritePages内です。
書き込みの動作は次の通りです。

void writestr(char *str) {//配列に対応 /* Everything written to the PDF file goes through this function. */ /* This means we can keep track of the file position without using */ /* ftell on a real (tmp) file. However, PCs write out 2 characters */ /* for \n, so we need this ugly loop to keep fpos correct */ fpos += strlen(str); while (*str) { //文字コードが0になるNULL,終端文字で終了 if (*str == '\n') fpos += LF_EXTRA; putchar(*str++); } }

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

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

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

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

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

Chironian

2016/01/09 13:53

ところで、「1行毎に文字を控えて」は日本語としては可笑しいです。「控える」は「待機する」「節制する」の意味で使われることが多いです。「念のため書きとめておく」という意味で「要点を控える」のような使い方もしますが、「1行毎に文字を記録する」の意味で「控える」を使うことはまずありません。質問やコメントの意味が分かりにくくなりますので、あまり特異な表現は使わないようにしませんか?
guest

回答2

0

自己解決

if (ch == '(' || ch == ')' || ch == '\')str[x] = '\'; x = x + 1;
の部分があるが、ここで{}を使っておらず、IF分での「やってほしいこと」をうまくしていできなかった。
if (ch == '(' || ch == ')' || ch == '\'){str[x] = '\'; x = x + 1; }
のように、{}でくくれば解決した。

投稿2016/01/11 09:45

Cobalt

総合スコア10

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

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

0

こんにちは。

text2pdfってこれですね!!
高々500行弱のCプログラムでpdfが作れるとはびっくりです。

さて、Cobaltさんのやりたいことが今一みえませんが、恐らく標準入力から入力した文字列をPDFファイル化したいのですよね?

msvc 2015で下記コマンドだけでビルドできました。

cl text2pdf.c

そして、下記コマンドで起動することで、標準入力から入力した行をtest.pdfとして出力してくれました。

test2pdf >test.pdf

入力の最後は、Ctrl+Z[Enter]でEOFを入力すればOKです。
この動作でCobaltさんのやりたいことができているのではないでしょうか?

投稿2016/01/09 13:25

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問