アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語のプログラム中に使うsystem()関数に変数を使う場合

system("sort < a.txt |uniq >aa.txt");

という関数を使うと
テキストファイル a.txt は編集(sort,uniqにより)され aa.txt となるのですが

このファイル名を変数として扱いたいので

char str[255];

for(z=0; z<255; z++){

sprintf(str,"sort < %d.txt |uniq >0%d.txt", z, z);
system(str);
}

という形にすると
0.txt → 00.txt 1.txt → 01.txt と255.txtまで編集されると思ったのですが
編集後のファイルが白紙で現れてしまいます。

system("sort < a.txt |uniq >aa.txt");

のファイル名に変数を扱い
複数のファイルの編集をするためには
どのようなプログラムを作成すると良いのでしょうか?
ご回答よろしくお願いいたします。

A 回答 (4件)

一度、systemは使わず、


sprintf(str,"sort < %d.txt |uniq >0%d.txt", z, z);
ではなく
printf("sort < %d.txt |uniq >0%d.txt\n", z, z);
で出力が正しいことを確認した上で
a.out | sh
で実行するとか

↓のようにシェルスクリプトで作るとか
#!/bin/sh
n=0
while [ n -le 255 ]
do
sort < $n.txt |uniq > 0$n.txt
n=`expr $n + 1`
done
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
自分が思っていた以上に
難しいやり方をしていたんだと感じました。
教えて頂いたやり方を参考に
理解したいと思います。

お礼日時:2010/10/30 19:49

たとえば 0.txt ファイルが



111
000
222
555
000
444
222
000

更に 1.txtファイルが

123
012
234
567
012
456
234
012

とするとき、次のプログラムを実行し、作成された 00.txt ならびに 01.txt を確認してみてください。
なお、エラーチェックはしていないので、付加してください。




/* source file: s310.c
compile: gcc s310.c
execution: ./a.out txt 2
ファイル名 txt およびファイル数 2 は、環境に応じて変更のこと。
*/

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

int main(int argc, char *argv[])
{
int z, n;
char str[255], *c;

n = atoi(argv[--argc]);
c = argv[--argc];
for(z = 0; z < n; z++) {
sprintf(str, "sort -u <%d.%s >%02d.%s\n", z, c, z, c);
// printf(str);
system(str);
}

return 0;
}
    • good
    • 0

systemの実行ディレクトリが、想定するターゲットディレクトリと違う可能性が高いかと。


個人的にはシェルスクリプトで完結させる方が簡単な気がしますが……
    • good
    • 0
この回答へのお礼

ありがとうございます。
シェルスクリプトを調べつつ
ディレクトリ処理を考え直してみたいと思います。

お礼日時:2010/10/30 19:40

プログラムにおかしいところはないので、期待しない動作と言うことはそれ以外の所に勘違いなどがあると思われます。

    • good
    • 0
この回答へのお礼

そうですか。ありがとうございます!
もう1度、プログラム全てを
見直してみます。

お礼日時:2010/10/30 19:38

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