C言語の出力を上書きする
C言語のプログラムで、実行中に進捗を表示させたくなった。
しかし、
10%
20%
...
100%
などと連続して表示させるのもどこか格好わるい。
できれば、
|-| 10%
と出たあと、それに上書きする形で
|--| 20%
と出て、最終的には
|----------| 100%
しか標準出力に残っていない形が望ましい。
printf()にそんな機能があるか調べてみたら、やはりあった。
(正確にはprintf自体の機能ではなく、エスケープシーケンスで
その動作が実行できるだけだが……。)
まず、printfを使い
printf("hogehoge row No. 1");
適当な文字列を出力する。ここで改行"\n"を使わないのがポイント。
これに上書きしたい文字を、またprintfを使い出力する。
このとき、文字列の先頭に"\r"(その行の先頭に戻る)を入れる。
printf("\rhogehoge row No. 2");
こうすると、最初のhogehoge row No. 1が上書きされて
hogehoge row No. 2だけが標準出力に残るようになる。
なお、処理系によっては"\n"を入れないとバッファを吐き出してくれない
(準備は整っているのに出力してくれない)場合があるので、
その場合は最初のprintfと次のprintfの間に
fflush(stdout);
を入れると、"\n"を入れなくても標準出力に出してくれる。
使用するライブラリまで明示的に書くと以下の通り。
#include<stdio.h>
#include<unistd.h> // sleep()関数のためのライブラリ。
int main(void)
{
printf("hogehoge row No. 1");
fflush(stdout);
sleep(1); // 次の処理に移る前に1秒待つ。これをしないとすぐに表示が切り替わる。
printf("\rhogehoge row No. 2");
printf("\n");
return 0;
}
ちなみに、"\b"(バックスペース)で以前表示した文字列を消して、
その上から書き始めるというテクニックもあるらしい。
こちらの方が、普段キーボードを使っている感覚に近いかもしれない。
以下を参考にしました。
emacs上でmozcを使う
emacsで日本語入力を行うとき、
ctrl + \ で切り替えると変換の効率が悪く使いにくい。
そのため、しばらくは他のアプリケーション同様
全角/半角キーで入力メソッド*1を切り替えていたのだが、
全角と半角を混ぜた入力を行いたいとき(latexなどは特にそう)に
切り替えがうまく行かないトラブルが発生していた。
ctrl + \ で切り替えればそのトラブルは発生しないので、
emacsデフォルトの入力メソッドをmozcにできないか調べたところ、
次のページがヒットした。
Panasonic Let's Note CF-S10(CF-S10CEFDP) page
このページを参考にさせていただき、
私のubuntuにemacs-mozcをインストールしたところ、
ctrl + \ で快適な日本語入力ができるようになった。
これで修論も捗る……はず。
*1:私はmozcを使っている。
latex で横向きの表を複数ページに出力
行も列も長い表をlatexで出力するとき、
解決策の一つとして横向き(←列がすべて出力されるようになる)の
表を複数ページにわたって出力することが考えられる。
そのやり方のメモ。
横向きの表
- lscapeパッケージが入っているか確認
find /usr/share -name lscape.sty
あればOK。なければインストール。 - \usepackage{lscape}
- 横向きにしたい表を\begin{landscape} ~ \end{landscape}で
はさむ。
\begin{landscape}
\begin{table}
\centering
\begin{tabular}{cccc}
…
\end{tabular}
\end{table}
\end{landscape}
複数ページにわたる表
- longtable.styの確認
- \usepackage{longtable}
- table環境をlongtable環境に置き換え、tabular環境を消す。
最後の手順は下のような操作。
修正前)
\begin{table}[ht]
\centering
\caption{hogehoge.}
\label{tab:foo}
\begin{tabular}{cccc}
予算 & 支出 & 残高 & 実績 \\ \hline
10000 & 111 & 99889 & ? \\
…
\hline
\end{tabular}
\end{table}
修正後)
\begin{longtable}[c]{cccc}
予算 & 支出 & 残高 & 実績 \\
\hline \endhead % 最上列に表示される内容
\hline \endfoot % 表の最後に表示する内容
10000 & 111 & 99889 & ? \\
…
\end{longtable}
1ページ目の最上列にのみ表示させたい内容がある場合は、
\begin{longtable}の行と\endheadの間に
その内容と\endfirstheadを上と同様に挿入する。
参考: