にちにちメモ

天文系大学院生のブログ。日々の生活の中で忘れがちなこと/忘れたくないことをメモ。

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"(バックスペース)で以前表示した文字列を消して、
その上から書き始めるというテクニックもあるらしい。
こちらの方が、普段キーボードを使っている感覚に近いかもしれない。

 

以下を参考にしました。

標準出力の上書き - C・C++ - 教えて!goo

標準入出力関数(1)

fflush

emacs上でmozcを使う

emacsで日本語入力を行うとき、
ctrl + \ で切り替えると変換の効率が悪く使いにくい。

そのため、しばらくは他のアプリケーション同様
全角/半角キーで入力メソッド*1を切り替えていたのだが、
全角と半角を混ぜた入力を行いたいとき(latexなどは特にそう)に
切り替えがうまく行かないトラブルが発生していた。

ctrl + \ で切り替えればそのトラブルは発生しないので、
emacsデフォルトの入力メソッドをmozcにできないか調べたところ、
次のページがヒットした。

Panasonic Let's Note CF-S10(CF-S10CEFDP) page

このページを参考にさせていただき、
私のubuntuemacs-mozcをインストールしたところ、
ctrl + \ で快適な日本語入力ができるようになった。

これで修論も捗る……はず。

*1:私はmozcを使っている。

latex で横向きの表を複数ページに出力

行も列も長い表をlatexで出力するとき、
解決策の一つとして横向き(←列がすべて出力されるようになる)の
表を複数ページにわたって出力することが考えられる。

そのやり方のメモ。

横向きの表

  1. lscapeパッケージが入っているか確認
     find /usr/share -name lscape.sty
    あればOK。なければインストール。
  2. \usepackage{lscape}
  3. 横向きにしたい表を\begin{landscape} ~ \end{landscape}で
    はさむ。
    \begin{landscape}
      \begin{table}
        \centering
        \begin{tabular}{cccc}
        …
        \end{tabular}
      \end{table}
    \end{landscape}

 

複数ページにわたる表

  1. longtable.styの確認
  2. \usepackage{longtable}
  3. 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を上と同様に挿入する。

 

参考:

LaTeX 表の書き方

LaTeXで横長の表を90度回転させて配置する方法

 

[改訂第6版] LaTeX2ε美文書作成入門

[改訂第6版] LaTeX2ε美文書作成入門

 

 

ubuntu ショートカットキーメモ (1)

スクリーンショット

  • 画面全体を撮る
     PrintScreen 
     gnome-screenshot (とターミナルに打つ。以下同様。)
  • 範囲を指定して。
     Shift + PrintScreen
     gnome-screenshot --area
  • 選択されているウィンドウを撮る
     alt + PrintScreen
     gnome-screenshot --window
  • 3秒後にスクリーンショット
     gnome-screenshot --delay=3

参考サイト: 

[Ubuntu, Linux Mint] スクリーンショットを撮る | Memo on the Web