いつもお世話になっています。レゴラスです。
ファイルから1行読みしたファイルのパスをリストコントロールに
表示させようとしたら、実際にファイルに入っている
ファイルパス文字列+□ という文字列で表示されてしまいます。
この □ は、改行コードか何かが文字化け?かなにか
してるんでしょうか。。
この□そのものが出てしまっている原因を調べていたのですが
行き詰まってしまいました。
読むファイルの形式はファイルパスが入れ子になっていて
--FILE--
C:/abc.bat
D:/def.bat
--FILE--
といった感じになっています。
これら2行ずつを順番に読み込んで、文字列としてつなげて
リストに表示しようとしています。
以下にソースコードをのせます。
どなたかヒント下さい。。m(__)m
--以下ソースコード--
#define LIST_FILENAME Sync.dat
typedef struct Synchro{
char befFilePath[512];
char aftFilePath[512];
} syncStruct;
syncStruct sync[100];
FILE *FP_LIST;
int lineIndex=0;
char lineBuff[512];
char setPath[1030];
int putDataIndex=0;
FP_LIST = fopen(LIST_FILENAME, r);
while(fgets(lineBuff, 512, FP_LIST) != NULL){
if(putDataIndex % 2){
strcpy(sync[lineIndex].aftFilePath , lineBuff);
strcpy(setPath, sync[lineIndex].befFilePath);
strcat(setPath, → );
strcat(setPath, sync[lineIndex].aftFilePath);
SendDlgItemMessage(hDlg, LST_FILELIST, LB_ADDSTRING, (WPARAM)
lineIndex, (LPARAM)setPath);
lineIndex++;
} else {
strcpy(sync[lineIndex].befFilePath , lineBuff);
}
putDataIndex++;
}
fclose(FP_LIST);
自己レスです。
力技でこんなことしたら上手くいきました。
根本的な解決ではないのですが、、
strncpy(sync[lineIndex].befFilePath, lineBuff, strlen(lineBuff)-1);
↑これで改行コードをコピーしないようにしてるだけ
なんですけど。。(汗)
う~ん、、スマートじゃない。(^^;
でも一応はいけてる(笑)
ただ、最終行のデータに改行コードが無かったら
1文字消える計算です。。(汗)
適当な文字列をメモ帳で書いたものを
ダンプさせてみたのですが、ただの改行でも
Carriage Return(CR) : 0x0d
Line Feed(LF) : 0x0a
の2バイトを使っています。
しかし、fgets()はMSDNによりますと
「最初の改行コード\nが現れるか…」
とあります通り、最初の\nLFまでを
拾ってくるので、結果CR\rも
含むことになります。
そのため、ゴミが発生するのではないでしょうか。
どう回避するかはお任せします。
fgets()ではなくてgets()ではだめなんでしょうか?
MSDNでは改行コードをNULLに変換するとありますが。
使ったこと無いので違っていたらすみません(^^;)
サンプルを組んで実際に動作させて見ました。
末尾についているのは0x0a(LF)でした。
確かにMSDNにも「改行文字は、読み込まれると
文字列に組み込まれます」とありますね。
見落としておりました。 お恥ずかしい限りです。
ひろぴーさんの代替案ですが、gets()はstdinからしか
読み込むことができません。
ですので、プログラムの引数に<****.txt等とすれば
(幾分勝手が悪いですが)動作いたします。
実際にgets()で試してみたところCRもLFも
含まれておりませんでした。
また別案として、fscanf()もありますので
ご考慮されてはいかがでしょうか。
単に読み込んだ文字列の終端にある'\r'をつぶす、ではダメですか?
if( lineBuff[strlen(lineBuff)-1] == '\r' )
lineBuff[strlen(lineBuff)-1] = '\0';
コピーなら、
strncpy(sync[lineIndex].befFilePath, lineBuff,
lineBuff[strlen(lineBuff)-1] == '\r' ?
strlen(lineBuff)-1 : strlen(lineBuff));
みなさん情報ありがとうございました。
本屋でリファレンス本を立ち読みしてたら
fgetsで読む場合、\r\nがWindowsでは、
一緒に入ってくる。という部分を見つけました。
とゆーことで、とりあえずの対処として
\r\nを基本的に削除するようにしました。
ありがとうございました。