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

 今、名前がすべてランダムで付けられたcsvファイル数十個を
すべて共通の書式の名前に変更するプログラムを作成中なのですが、
最初の段階で躓いてしまいました。
どこの部分かというと、
rename("DATA\\str", "yyyymmdd.csv");
この部分です。
以下私の書いてみたソースです。

int main(void)
{
int result;
char str[20];
FILE *li_fp;

li_fp = fopen("filelist.txt", "r");
memset(liststr, '\0', 20);
fgets(liststr, 20, li_fp);
result = rename("DATA\\str", "yyyymmdd.csv");
if (result != 0)
{
printf("名前の変更に失敗しました。\n");
perror("rename error");
}
fclose(li_fp);
}
カレントディレクトリ内に、
filelist.txtとDATAというフォルダがあります。
filelist.txtには、DATAの中にあるcsvデータの名前が列挙されています。
DATAフォルダの中には、filelist.txtで列挙されたものの
実際のデータが入ってます。

filelist.txtの中身はこんなかんじです。
aabbcc.csv
ddeeff.csv
gghhii.csv
 ・
 ・
 ・
実際はもっとぐちゃぐちゃしたファイル名ですが、わかりやすいように
簡略化して書かせていただきます。

fgetsで一行目の
aabbcc.csvをstrに取り込み、rename関数を使い、DATAフォルダの中の
aabbcc.csvをyyyymmdd.csvに変更したいのですが、
実行結果は
名前の変更に失敗しました。
rename error: NO such file or directory
と表示されてしまいます。
絶対パスでの指定方法も試してみましたが、同じ結果でした。
この部分がわからないと先を作っても意味がないので困っております。
よろしくお願いいたします。

A 回答 (3件)

char path[256];


fgets(str, 20, li_fp);
if (str[strlen(str)-1] == '\n') str[strlen(str)-1] = '\0';
sprintf(path, "DATA\\%s", str);
rename(path, "yyyymmdd.csv");

もちろんyyyymmddになんらかの日付を入れたいのなら別に処理が必要です
    • good
    • 0
この回答へのお礼

rename("DATA\\str", "yyyymmdd.csv");
の"DATA\\str"の書きかたで引っかかっていたのが解消されました。
sprintfで全部詰め込んでから書けばよかったんですね。
sprintfは用途が分からずあまり使ったことがなかったのですが、
これからはよく使うことになりそうなので、もう一度よく調べてみます。
yyyymmddに日付を入れる処理はもうできているので、
これでようやく
○月から×月までのデータを足す。
などの処理ができるようになりました。
ありがとうございました!!!

お礼日時:2008/06/18 13:52

このソースを見る限りだとエラーになるのは当然です。


1.
> fgets(liststr, 20, li_fp);
ここでファイルから読み込んだliststrを使用していない。
2.
> result = rename("DATA\\str", "yyyymmdd.csv");
これだとDATAフォルダ内の"str"ってファイルを"yyyymmdd.csv"に変更します。
DATAフォルダ内に"str"ってファイルが無い限りはリネームできません。
    • good
    • 0
この回答へのお礼

すいません。ソースをコピーする際、余計な部分を削り、長い変数名を
片っぱしから変えていったときかえ忘れたようです。

実際はstrで統一しております。
申し訳ありませんでした。

お礼日時:2008/06/18 13:42

fgets関数は改行文字(\n)も読み込んでしまうので、読み込んだ文字列の最後に改行文字があるかどうかを調べ、あれば削除すれば大丈夫かと思われます。

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

改行文字は盲点でした。確かにLFが入ってたら一致しませんね(苦笑
strを1バイトづつ見ていってLF(10)が来たら¥0を代入する
コードを追加しました。

ありがとうございます!

お礼日時:2008/06/18 13:40

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