- ベストアンサー
別ディレクトリ内のファイルを文字列変数を使ってrenameしたいのですが・・・
今、名前がすべてランダムで付けられた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 と表示されてしまいます。 絶対パスでの指定方法も試してみましたが、同じ結果でした。 この部分がわからないと先を作っても意味がないので困っております。 よろしくお願いいたします。
- みんなの回答 (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になんらかの日付を入れたいのなら別に処理が必要です
その他の回答 (2)
- andy_kun
- ベストアンサー率23% (64/274)
このソースを見る限りだとエラーになるのは当然です。 1. > fgets(liststr, 20, li_fp); ここでファイルから読み込んだliststrを使用していない。 2. > result = rename("DATA\\str", "yyyymmdd.csv"); これだとDATAフォルダ内の"str"ってファイルを"yyyymmdd.csv"に変更します。 DATAフォルダ内に"str"ってファイルが無い限りはリネームできません。
お礼
すいません。ソースをコピーする際、余計な部分を削り、長い変数名を 片っぱしから変えていったときかえ忘れたようです。 実際はstrで統一しております。 申し訳ありませんでした。
- penta1331
- ベストアンサー率64% (16/25)
fgets関数は改行文字(\n)も読み込んでしまうので、読み込んだ文字列の最後に改行文字があるかどうかを調べ、あれば削除すれば大丈夫かと思われます。
お礼
改行文字は盲点でした。確かにLFが入ってたら一致しませんね(苦笑 strを1バイトづつ見ていってLF(10)が来たら¥0を代入する コードを追加しました。 ありがとうございます!
お礼
rename("DATA\\str", "yyyymmdd.csv"); の"DATA\\str"の書きかたで引っかかっていたのが解消されました。 sprintfで全部詰め込んでから書けばよかったんですね。 sprintfは用途が分からずあまり使ったことがなかったのですが、 これからはよく使うことになりそうなので、もう一度よく調べてみます。 yyyymmddに日付を入れる処理はもうできているので、 これでようやく ○月から×月までのデータを足す。 などの処理ができるようになりました。 ありがとうございました!!!