標題についてご教授下さい。

シェル内でpsqlコマンドから オプション c にて
BEGIN

DELETE

COPY xxx FROM xxx.sql

COMMIT

の流れでシェルコマンドを実行したいのですが、
いい方法ありますでしょうか。

もちろんエラーハンドリングもしたいです。
COMMIT前に エラーがあったらROLLBACK したいです。

シェルだと難しいのでしょうか。

A 回答 (1件)

AUTOCOMMITをOFFにすればよさそうです。



http://heppoen.seesaa.net/article/147918073.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

AUTOCOMMITをoffにした場合、
シェルの一行で、
全てを簡潔させなければいけないんですよね。

psql -hlocalhost example DELETE FROM test | \copy test FROM test.sql

上記の様に記述したいです。

お礼日時:2013/07/03 10:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QJavaでデータ構造

最近Javaの学習を開始しました。
入門書をちょっと読んでみたのですが、気になったことがあります。

2分木などのデータ構造は、一つのオブジェクトの中に入れるのでしょうか?
それとも、オブジェクトをつないでデータ構造を組み立てるのでしょうか?
直感的に、前者のような気がしているのですが、ハッキリ分かりません。

参考:
お遊びのプログラムしか作ったことが無いのですが、一応Cは一通りやりました。

Aベストアンサー

「データ構造」という語の使われ方に二通りあります。

一つは、部分と部分が相互に関連し合っているデータが全体としてどういう形になっているかという意味です。
例えば、氏名と出身県が書かれたレコードが集まったデータがあったとします。このデータが氏名順にソート
されている場合と出身県順にソートされている場合とでは、構造が異なります。木のようなデータであれば、
それはまたそれなりの構造があるわけで、恐らくdet_mul2さんの使い方はこれに近いと思います。

もう一つは、一まとまりの情報がどのような形式で実現されているかという意味です。先の例で言うと、氏名の
後に出身県が書かれている場合と出身県の後に氏名が書かれている場合とでは構造が違うというわけです。
「抽象データ型が表現している数学モデルをコンピュータの記憶内に実装したものがデータ構造である。」と
いう表現は、こちらに近いと思います。

実のところ、後者の意味での「データ構造」という用語の使用は、私は誤用だと思っています。(つまり
det_mul2さんが正しい。)ですから、三つの概念の関係で言えば、抽象データ型の概念を発展させたものが
クラスであって、データ構造とは必ずしも結びつく概念ではないと、私は思います。(テキストを書かれた方は、
また違った考え方なのでしょうけれど。)

「データ構造」という語の使われ方に二通りあります。

一つは、部分と部分が相互に関連し合っているデータが全体としてどういう形になっているかという意味です。
例えば、氏名と出身県が書かれたレコードが集まったデータがあったとします。このデータが氏名順にソート
されている場合と出身県順にソートされている場合とでは、構造が異なります。木のようなデータであれば、
それはまたそれなりの構造があるわけで、恐らくdet_mul2さんの使い方はこれに近いと思います。

もう一つは、一まとまりの情報...続きを読む

Qご教授ください。(Windows バッチコマンド)

よろしくお願いします。
ここのところ質問ばかり申し訳ありません。
自分の頭の悪さに泣いております・・・。

以下のバッチファイル(Windows2000)を
作成できればと検討中です。
もし宜しければご教授願えますでしょうか。
さっぱり分かりません。

Q1.
あるアプリケーションが出力するログがあります。
このログを2世代管理したいと考えています。
1日目に出力されたログを abc.log とすると、
2日目のアプリケーションの起動時にこの「abc.log」
を「abc.日付」にコピーし、「abc.log」の内容を
クリアし、2日目のアプリケーションのログを
書き出せるようにする。
3日目のアプリケーションの起動時に「abc.log」を
「abc.日付」にコピーし、「abc.log」の内容の
クリアと2日目に作成した「abc.日付」(内容は1日目
のログ)を削除する。

Q2.
この曜日ならこの処理をする。
というように、曜日で処理を分岐させる。

どうぞ宜しくお願い致します。

Aベストアンサー

個人的には、WSHを使った方が書きやすいと思いますが、バッチの小ネタをいくつか。

1)日付文字列の作成:

SET TODAY=%DATE:~-10,-6%%DATE:~-5,-3%%DATE:~-2%
ECHO %TODAY%

%DATE%の出力はロケールに依存するので、調整が必要かも。

2)日付の最も旧いファイル名の取得:

FOR /F "usebackq" %%f IN (`dir /b/o:-d a.log.*`) DO SET OLDLOG=%%f
ECHO %OLDLOG%

3)ファイルの内容を空にする:

COPY /y NUL a.log

4) 曜日の取得

……はあまり良い手が思いつかない。%DATE%に含まれていれば簡単ですが。

cygwinのlogrotateとか使った方が手っ取り早いかも。

Qアルゴリズムとデータ構造の本のついて

現在、「珠玉のプログラミング」を読んでいるのですが、書いてある内容が理解しにくいのでもう少し難易度を下げたアルゴリズムとデータ構造の本を探しています。

珠玉のプログラミングを読む前に読んでおいた方がいい本やもう少し難易度が低い本があれば教えて頂けないでしょうか。

ちなみに、以下の書籍で一応学習しました。全て理解は出来ていませんが…

・Javaで学ぶアルゴリズムとデータ構造 Robert Lafore 著 岩谷 宏 訳

ただアルゴリズムとデータ構造について知っているだけでは意味が無いと思い、アルゴリズムをどうやって応用していくかなどが書いてある「珠玉のプログラミング」を読む至りました。

よろしくお願い致します。

Aベストアンサー

ご提示の書籍は両方とも読んだことがなく判断ができないので、あくまでも参考としてお読み下さい。


私が入門レベルの次として読んだ書籍です。いずれもC言語です。

・定本 Cプログラマのためのアルゴリズムとデータ構造
 http://www.amazon.co.jp/gp/product/4797304952/

・Cによる探索プログラミング―基礎から遺伝的アルゴリズムまで
 http://www.amazon.co.jp/C%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A2%E7%B4%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%BE%E3%81%A7-%E4%BC%8A%E5%BA%AD-%E6%96%89%E5%BF%97/dp/4274067300/


あと、頭を鍛えるという意味では、以下の書籍も良いかもしれません

・プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
 http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/
 解答はRubyで記述されていますが、一問のプログラムは短いですし考え方も記載してありますのでRubyをご存知なくても恐らく問題ないかと思います。

・アルゴリズムパズル ―プログラマのための数学パズル入門
 http://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%91%E3%82%BA%E3%83%AB-%E2%80%95%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB%E5%85%A5%E9%96%80-Anany-Levitin/dp/4873116694/
 こちらは解答がなく、考え方(アルゴリズム)のみ記載されています。



もしご興味が湧くようでしたら、書店で現品を確認してみてください。

ご提示の書籍は両方とも読んだことがなく判断ができないので、あくまでも参考としてお読み下さい。


私が入門レベルの次として読んだ書籍です。いずれもC言語です。

・定本 Cプログラマのためのアルゴリズムとデータ構造
 http://www.amazon.co.jp/gp/product/4797304952/

・Cによる探索プログラミング―基礎から遺伝的アルゴリズムまで
 http://www.amazon.co.jp/C%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A2%E7%B4%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E5%9F%BA%E7%A4%8...続きを読む

Qシェルのfindコマンドであるディレクトリ以外のファイルを検索

ホームディレクトリにある.(例.dtや.atok)ディレクトを検索対象から外し尚且つ、*aa*のファイルを検索するにはどうしたら良いでしょうか?

find . -type d -name .dt -prune -o -print | xargs grep "*aa*"
でいろいろやってみましたができませんでした。

OS:HP-UX K-Shellです
どうぞ宜しくお願いいたします。

Aベストアンサー

安易な手としては、

find . -type f -print | grep -v './.atok/' | xargs grep "*aa*"

"*aa*" は正規表現として正しくないですが、意図したことがわからないのでそのままにしてあります。

Q都内でデータ構造とアルゴリズムが勉強出来る所?

聴講生として、データ構造とアルゴリズム又はC++のクラスを取れる大学や教育機関を教えてください!

Aベストアンサー

C++等のプログラム言語自体の講義を手とり足とり教えてくれる大学は無いでしょう。
個人で解説本なり参考書等を購入する、参考サイト等で調べて、自分のペースでプログラムの作成コンパイルデバッグ等を繰り返して身に付ける他ないのではと思われます。

データ構造とアルゴリズム等はある程度講習される事もあるかと思いますが、これもC++等と同じくわざわざ聴講生として教わるよりも自分で調べる方が良いのではないでしょうか。

次等を参考にして下さい。

http://oshiete.goo.ne.jp/qa/7398476.html
情報関連の参考書について

########

それから特定のサイト内に情報がありそうな時は、サイト内サーチを使うと便利です。

http://www.atmarkit.co.jp/ ==>

C++ 入門 OR 初歩 OR 基礎 OR 解説 site:http://www.atmarkit.co.jp/
アルゴリズム OR データ構造 site:atmarkit.co.jp

新しい情報をサーチしたい場合、最終更新日時(googleに更新が確認し収集された日時)を追加すると便利です。
http://www.google.co.jp/advanced_search?hl=ja

&as_qdr=, &tbs=qdr: 等の項目がサーチ条件の中に出てきていた場合は、その内容を次の通りに書き換えます。
サーチ条件内に出てきていない時は最後に追加します。

&as_qdr=all ==> &as_qdr=y    (制限なし ==> 一年以内)
&tbs=qdr:m ==> &tbs=qdr:m6  (一月以内 ==> 6か月以内)

&as_qdr=, &tbs=qdr: の後には次の文字、文字+数値が指定できます。
 y, m, w, d, h, n <==> 年、月、週、日、時間、分 

C++ site:atmarkit.co.jp ==>

https://www.google.co.jp/search?hl=ja&as_q=C%2B%2B+site%3Aatmarkit.co.jp&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=&as_occt=any&safe=active&as_filetype=&as_rights=

==> 2年以内の情報のみサーチ

https://www.google.co.jp/search?hl=ja&as_q=C%2B%2B+site%3Aatmarkit.co.jp&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=y2&as_sitesearch=&as_occt=any&safe=active&as_filetype=&as_rights=

C++等のプログラム言語自体の講義を手とり足とり教えてくれる大学は無いでしょう。
個人で解説本なり参考書等を購入する、参考サイト等で調べて、自分のペースでプログラムの作成コンパイルデバッグ等を繰り返して身に付ける他ないのではと思われます。

データ構造とアルゴリズム等はある程度講習される事もあるかと思いますが、これもC++等と同じくわざわざ聴講生として教わるよりも自分で調べる方が良いのではないでしょうか。

次等を参考にして下さい。

http://oshiete.goo.ne.jp/qa/7398476.html
情報関連...続きを読む

Qシェルの中で現在の時間の2分後にコマンドを設定したい。

シェルの中で現在の時間の2分後にコマンドを設定したい。

時間指定でコマンドを実行するのは下記のコマンドでOKなのはわかりましたが、
2分後の時間をとるのがわかりません。

echo "ls" | at 10:11:22

ぐぐった結果は「date -v+2M」というコマンドで取れるとの情報がありましたが、
オプションが正しくないと怒られてしまいます。

使用法: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]

"date +%T"で時間を取得して中身をばらして+2分してatにセットすればよいと思うのですが。。。
他のやり方でもありましたらよろしくお願い致します。

Aベストアンサー

date --date '2 minutes'
ではどうです?

Qデータ構造の保存法について

データ構造のメモリ上の状態、つまりポインターによるノード間のつながりをファイルに保存して、そのファイルを読み込むとコンピュータ上で前回のデータ構造を再現(ポインターによるつながりを再現)できる方法を探しています。
現在バイナリーツリーで上記の保存法を色々探したり考えたりしているのですが、いい方法が見つかりません。
各ノードに番号をふってファイルに保存し、次回読み込んだときに上手く工夫してやればできるかな、といった程度です。
ご存知の方がおられたら教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

お待たせしました.読み込み用サンプルプログラムです.


> 今まで、テキストでの保存しかやったことがないのでこれを機会に
> バイナリでの保存を勉強していきたいと思います。

#5 は fwrite() を fprintf() に変えればほとんどそのままでテキストファイル用になります.
ただし,読み込み側では構文のチェックなどを行わなければならないので少々面倒です.


●#5 に対する変更
#5 で使用したデータ構造を,読み込み/書き出しで共用できるようにするため,一部変更しました.
(1) Node_t::name[] の要素数の宣言を変更:MAXNAME → 1 に変更.
読み込み時にスタックを余計に消費しないようにするため.
この変更は #5 のプログラムには影響なし.
実際には必要なサイズを確保する.名前の長さは事実上無制限になる.
#define MAXNAME は不要になったので削除.
(2) TraverseArgs_t のメンバを変更
・out メンバを,読み込みにも使用するようにしたため,名前を fp に変更.
#5 のプログラムで out を fp に変更すること.
・読み込みに必要なメンバ (nodeTable) を追加.この変更は #5 のプログラムには影響なし.


●問題点
さっき,#5 のプログラムの問題に気付きました.(^^;)
ツリーが空 (節点が一つもない,root=NULL) の時はクラッシュします.
つまり,空のツリーは保存できません.
現在の実装では,子節点の childExists フラグを書くようになっていますが,
それを廃止して,節点自身の nodeExists フラグを書くようにする方がいいです.
つまり,SaveSubtree() で最初に nodeExists = (node != NULL) を読み書きし,
それが偽ならば節点の読み書きをしないようにします.
(#5 と対応させるため,次の読み込みプログラムにはこの変更を行っていません.)


●読み込み用サンプルプログラム (コンパイルは通してますが,動かしてはいません.)

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINKS 4 /* 1節点から出る最大リンク数 */

#define OK 0
#define FAIL (-1)

/* 節点のデータ構造の定義 */
typedef struct Node Node_t;
struct Node {
Node_t *child[2]; /* 左右の子節点へのポインタ */
Node_t *link[MAXLINKS]; /* 木の親子関係以外の節点間リンクまたは NULL.*/
/* この配列の添字がリンクIDとなる.*/
unsigned no; /* 節点番号 */

/* 以下,この節点自身のデータ */
int data;
char name[1]; /* 節点名 (の最初の1バイトのみ宣言) */
};

/* トラバース中に各節点からアクセスされる変数をまとめた構造体 */
typedef struct {
unsigned nNodes; /* トラバース中は現在までに読み込んだ節点数,トラバース後は節点の総数.*/
unsigned nLinks; /* 節点間リンクの総数 */
Node_t **nodeTable; /* 節点番号を節点へのポインタに変換するための配列 */
FILE *fp; /* ファイルの入出力ストリーム */
const char *fileName; /* ファイル名 */
} TraverseArgs_t;

/* 変数 var (ポインタ以外) をバイナリファイルから読む.*/
#define ReadVar(var, in) (fread(&(var), 1, sizeof(var), (in)) == sizeof(var))


/* node 以下の部分木を削除する.*/
void DeleteSubtree(Node_t *node)
{
if(node != NULL) {
unsigned i;

for(i = 0; i < 2; i++) DeleteSubtree(node->child[i]);
free(node);
}
}

/* 読み込みエラーのメッセージを出力する.*/
void ReadError(const TraverseArgs_t *args)
{
if((errno == 0) && feof(args->fp)) {
/* おそらく,ファイルが途中で終わってしまったためのエラー.*/
fprintf(stderr, "\"%s\": ファイルが途中で終わっています。", args->fileName);
} else {
fprintf(stderr, "\"%s\": 読み込みエラー (%s)\n", args->fileName, strerror(errno));
}
}

/* 部分木を読み,その根節点へのポインタを *pNode に返す.*/
int LoadSubtree(Node_t **pNode, TraverseArgs_t *args)
{
Node_t nodeBuf; /* 読み込んだ節点データを一時的に格納しておくためのバッファ */
Node_t *node; /* 読み込み成功時に生成される節点を指す.*/
char *name = NULL; /* 節点名を一時的に格納するバッファを指す.*/
size_t length; /* 節点名のバイト数 (終端 '\0' を含まない.) */
unsigned i;
unsigned char childExists; /* 子節点が存在しているときそのときに限り真.*/

*pNode = NULL; /* エラーの時に返す値を設定しておく.*/

/* nodeBuf を初期化する.
* nodeBuf.link[*] を NULL に,nodeBuf.name を空文字列に初期化しておく必要があるので,
* これらを memset() でまとめて行う.
*/
memset(&nodeBuf, 0, sizeof(nodeBuf));

/* 節点番号および節点自身のデータを読む.*/
if(!ReadVar(nodeBuf.no, args->fp) ||
!ReadVar(nodeBuf.data, args->fp) ||
!ReadVar(length, args->fp)) {
ReadError:
ReadError(args);
goto Error;
}
if(length > 0) {
/* 名前が空文字列でない場合 */
/* 名前用のバッファを確保する.*/
if((name = malloc(length + 1)) == NULL) {
NoMemory: /* メモリ不足 */
fprintf(stderr, "%s\n", strerror(errno));
goto Error;
}
/* 名前を読む.*/
if(fread(name, 1, length, args->fp) != length) goto ReadError;
name[length] = '\0';
}

/* 左右の子節点以下の部分木を読む.*/
for(i = 0; i < 2; i++) {
if(!ReadVar(childExists, args->fp)) goto ReadError;
if(childExists && (LoadSubtree(&nodeBuf.child[i], args) == FAIL)) goto Error;
}

/* 新しい節点を作成する.
* (下記の malloc() の引数は,本来は
* offsetof(Node_t, name[0]) + length + 1 (終端 '\0' の分)
* だが,定数を一つにまとめて書いてある.)
*/
if((node = malloc(offsetof(Node_t, name[1]) + length)) == NULL) goto NoMemory;
/* nodeBuf を *node にコピーする.*/
*node = nodeBuf;
if(name != NULL) {
/* 節点名をコピーする.*/
strcpy(node->name, name);
free(name);
}

/*読み込み成功 */
args->nNodes++; /* 読み込んだ節点数を数える.*/
*pNode = node; /* 読み込んだ部分木の根節点へのポインタを返す.*/
return OK;

Error:
if(name != NULL) free(name);
for(i = 0; i < 2; i++) DeleteSubtree(nodeBuf.child[i]);
return FAIL;
}


/* 節点番号を節点へのポインタに変換するためのテーブル (配列) を作成する.
* node 以下の部分木の各節点をテーブルに登録する.
* args->nodeTable[0 ~ args->nNodes-1] は NULL に初期化されていなければならない.
*/
int MakeNodeTable(Node_t *node, TraverseArgs_t *args)
{
if(node != NULL) {
unsigned i;

if((node->no < 1) || (node->no > args->nNodes)) {
fprintf(stderr, "節点番号 %u は範囲外です。(有効範囲:1~%u)\n",
node->no, args->nNodes);
return FAIL;
}
i = node->no - 1; /* 節点番号を配列の添字に変換.*/
if(args->nodeTable[i] != NULL) {
/* 既に同じ節点番号で別の節点が登録されている場合 */
fprintf(stderr, "節点番号 %u が重複しています。\n", node->no);
return FAIL;
}
args->nodeTable[i] = node; /* node を登録する.*/

/* node の子孫を登録する.*/
for(i = 0; i < 2; i++) {
if(MakeNodeTable(node->child[i], args) == FAIL) return FAIL;
}
}
return OK;
}


/* 節点番号を節点へのポインタに変換する.*/
Node_t *NodeNoToPointer(unsigned nodeNo, const TraverseArgs_t *args)
{
Node_t *node;

if((nodeNo < 1) || (nodeNo > args->nNodes)) {
fprintf(stderr, "節点番号 %u は範囲外です。\n", nodeNo);
return NULL;
}
if((node = args->nodeTable[nodeNo]) == NULL)
fprintf(stderr, "節点番号 %u は定義されていません。\n", nodeNo);
return node;
}


/* 全リンク情報を読む.*/
int LoadLinks(const TraverseArgs_t *args)
{
Node_t *fromNode, *toNode;
unsigned fromNodeNo, toNodeNo, linkId, i;

for(i = 0; i < args->nLinks; i++) {
/* 1組のリンク情報を読む.*/
if(!ReadVar(fromNodeNo, args->fp) ||
!ReadVar(linkId, args->fp) ||
!ReadVar(toNodeNo, args->fp)) {
ReadError(args);
return FAIL;
}
if(linkId >= MAXLINKS) {
fprintf(stderr, "\"%s\", Link #%u: LinkID %u は範囲外です。\n",
args->fileName, i, linkId);
return FAIL;
}
if(((fromNode = NodeNoToPointer(fromNodeNo, args)) == NULL) ||
((toNode = NodeNoToPointer(toNodeNo, args)) == NULL))
return FAIL;
/* リンク読み込み成功:リンクを設定する.*/
fromNode->link[linkId] = toNode;
}
return OK;
}


/* バイナリツリー全体をバイナリファイルから読む.
* 出力:(1) *pRoot:ツリーの根節点へのポインタ.
* (2) *pNodes:ツリーの全節点数.
*/
int LoadTree(const char *fileName, Node_t **pRoot, unsigned *pNNodes)
{
TraverseArgs_t args;
Node_t *root = NULL; /* バイナリツリーの根節点 */

/* エラーの場合に返す値を設定しておく.*/
*pRoot = NULL;
*pNNodes = 0;

args.nNodes = 0;
args.nLinks = 0;
args.nodeTable = NULL;
//args.fp = NULL;
args.fileName = fileName;
if((args.fp = fopen(fileName, "rb")) == NULL) {
fprintf(stderr, "\"%s\" をオープンできません。(%s)\n", fileName, strerror(errno));
goto Error;
}

/* 木構造および全節点の情報を読み込むとともに,節点数を数える.*/
if(LoadSubtree(&root, &args) == FAIL) return FAIL;

/* 全リンク数を読む.*/
if(!ReadVar(args.nLinks, args.fp)) {
ReadError(&args);
goto Error;
}

if(args.nLinks > 0) {
/* リンク情報がある場合 */

/* 節点番号を節点へのポインタに変換するためのテーブルを作成する.
* 配列の全要素を NULL に初期化しておく必要があるため,
* malloc() ではなく calloc() を使用する.
*/
if((args.nodeTable = calloc(sizeof(args.nodeTable[0]), args.nLinks)) == NULL) {
/* メモリ不足 */
fprintf(stderr, "%s\n", strerror(errno));
goto Error;
}
if(MakeNodeTable(root, &args) == FAIL) goto Error;

/* リンク情報を読む.*/
if(LoadLinks(&args) == FAIL) goto Error;

free(args.nodeTable);
args.nodeTable = NULL;
}

/* 読み込み成功 */
fclose(args.fp);
return OK;

Error:
if(args.nodeTable != NULL) free(args.nodeTable);
if(args.fp != NULL) fclose(args.fp);
DeleteSubtree(root);
return FAIL;
}

お待たせしました.読み込み用サンプルプログラムです.


> 今まで、テキストでの保存しかやったことがないのでこれを機会に
> バイナリでの保存を勉強していきたいと思います。

#5 は fwrite() を fprintf() に変えればほとんどそのままでテキストファイル用になります.
ただし,読み込み側では構文のチェックなどを行わなければならないので少々面倒です.


●#5 に対する変更
#5 で使用したデータ構造を,読み込み/書き出しで共用できるようにするため,一部変更しました.
(1) Node_t::name[] ...続きを読む

QDOSコマンドのループ内のTIMEコマンド

DOSコマンドのループ内のTIMEコマンド

ループの中で、少し時間のかかる処理を連続的に行ない、さらに時刻表示を行い
1回あたりの時間が分かるように表示したいと思っています。
下記のソースのイメージです。(極めてシンプルにしました)

しかし、ループ内で実行するtimeコマンドがすべて同じ
時刻になってしまい、意図通りの動きになりません。


ループ内で、ループごとに異なる時刻を表示することは可能でしょうか?
もしできるのであればその方法を教えてください。
よろしくお願いします。


@echo start◆%time%

@FOR /L %%I IN (0, 1, 3) DO @(
@echo %%I【%time%】
@ping localhost -n 2 > nul
)

@echo end ◆%time%

pause

Aベストアンサー

ループの前に
setlocal enabledelayedexpansion
と書いておいて、ループの中では
%time%の代わりに!time!を使いましょう。

QPerlのデータ構造について

Perlのデータ構造でわからないところがあります。
ハッシュの配列で、以下の構造がある場合

my %hash_array = (
1=>["aaa", "bbb"],
2=>["ccc", "ddd", "eee"],
3=>[],
4=>["fff"]
);

print $hash_array{1}[0]; # aaaが表示される。
print $hash_array{2}[2]; # eeeが表示される。

ですが、

$hash_array{1}は 2
$hash_array{2}は 3
$hash_array{3}は 0
$hash_array{4}は 1

のように個数を表示させるのは、どうすればよいでしょうか?


Perlのデータ構造に詳しいサイトや書籍はありますか?

また、Perl 5.6.1から Perl 5.8.7に乗りかえようとしていますが、
データ構造など大幅に変わった点はあるのでしょうか?

Aベストアンサー

scalar (@{$hash_array{1}});
scalar (@{$hash_array{2}});
scalar (@{$hash_array{3}});
scalar (@{$hash_array{4}});

これでそれぞれの要素数を表示します。

Qシェル(sh)で実行コマンドを標準出力するには

kshでコマンドを実行して結果をファイルにリダイレクトしています。
結果のみファイルに出力され、実行したコマンドを確認することができません。
実行コマンドも一緒にファイルに出力する方法がありましたら教えてください。
なお、実行コマンドをechoするってのはなしで。
多量のコマンドを実行する場合にめんどくさいので。

Aベストアンサー

ksh -x 実行コマンド > ファイル 2>&1
または
ksh -x 実行コマンド 2>&1| tee ファイル

参考URL:http://x68000.q-e-d.net/~68user/unix/pickup?tee


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング