コントロールへの表示 – プログラミング – Home

通知
すべてクリア

[解決済] コントロールへの表示


Legolas
 Legolas
(@Legolas)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

いつもお世話になっています。レゴラスです。
ファイルから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);


引用未解決
トピックタグ
Legolas
 Legolas
(@Legolas)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

自己レスです。

力技でこんなことしたら上手くいきました。
根本的な解決ではないのですが、、

strncpy(sync[lineIndex].befFilePath, lineBuff, strlen(lineBuff)-1);

↑これで改行コードをコピーしないようにしてるだけ
 なんですけど。。(汗)

う~ん、、スマートじゃない。(^^;
でも一応はいけてる(笑)
ただ、最終行のデータに改行コードが無かったら
1文字消える計算です。。(汗)


返信引用
kuma
 kuma
(@kuma)
ゲスト
結合: 21年前
投稿: 32
 

適当な文字列をメモ帳で書いたものを
ダンプさせてみたのですが、ただの改行でも
Carriage Return(CR) : 0x0d
Line Feed(LF) : 0x0a
の2バイトを使っています。

しかし、fgets()はMSDNによりますと
「最初の改行コード\nが現れるか…」
とあります通り、最初の\nLFまでを
拾ってくるので、結果CR\rも
含むことになります。
そのため、ゴミが発生するのではないでしょうか。

どう回避するかはお任せします。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

fgets()ではなくてgets()ではだめなんでしょうか?
MSDNでは改行コードをNULLに変換するとありますが。
使ったこと無いので違っていたらすみません(^^;)


返信引用
kuma
 kuma
(@kuma)
ゲスト
結合: 21年前
投稿: 32
 

サンプルを組んで実際に動作させて見ました。
末尾についているのは0x0a(LF)でした。
確かにMSDNにも「改行文字は、読み込まれると
文字列に組み込まれます」とありますね。
見落としておりました。 お恥ずかしい限りです。

ひろぴーさんの代替案ですが、gets()はstdinからしか
読み込むことができません。
ですので、プログラムの引数に<****.txt等とすれば
(幾分勝手が悪いですが)動作いたします。
実際にgets()で試してみたところCRもLFも
含まれておりませんでした。

また別案として、fscanf()もありますので
ご考慮されてはいかがでしょうか。


返信引用
PIP
 PIP
(@PIP)
ゲスト
結合: 22年前
投稿: 16
 

単に読み込んだ文字列の終端にある'\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));


返信引用
Legolas
 Legolas
(@Legolas)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

みなさん情報ありがとうございました。

本屋でリファレンス本を立ち読みしてたら
fgetsで読む場合、\r\nがWindowsでは、
一緒に入ってくる。という部分を見つけました。

とゆーことで、とりあえずの対処として
\r\nを基本的に削除するようにしました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました