CRの削除について
Posted: 2014年5月03日(土) 20:07
お世話になっております。
chibagoです。
windowsの改行文字CR+LFからUNIXのLFへ変更するプログラムを
http://www1.cts.ne.jp/~clab/hsample/Fil ... ile03.html
を参考に作っております。
環境はfedora16 gcc4.6.3です。
書いたコードは以下のようなものです。
これがうまく動かなくて困っております。
考え方としては、binaryモードで読み書きすることにより、
fgets,fputsでは改行文字は変更されないものと理解しております。
上記のプログラムでは、viで開くと^Mが残り、改行がなくなっております。末尾にCR+LFがあり、LFを削除しCR(^M)だけが残ったと考えると納得がいきます。
そこで、以下のように変更しました。 これで、初めのCRがLFに置き換わり、後のLFはヌル文字となり無効
になるかと期待したのですが、viで開くとなぜか^Mが残り、次の行の先頭に移っております。
挙動が理解できずどうして良いものかわかりません。
ご教授いただけると幸いです。
chibagoです。
windowsの改行文字CR+LFからUNIXのLFへ変更するプログラムを
http://www1.cts.ne.jp/~clab/hsample/Fil ... ile03.html
を参考に作っております。
環境はfedora16 gcc4.6.3です。
書いたコードは以下のようなものです。
bool FileUtil::remove_cr(const std::string path1,
const std::string path2){
FILE *fp;
FILE *fp2;
char string[256];
if ((fp = fopen(path1.c_str(), "rb")) == NULL) {
std::cout<<"Can not open "+path1<<std::endl;
return false;
}
if ((fp2 = fopen(path2.c_str(), "wb")) == NULL) {
std::cout<<"Can not open "+path2<<std::endl;
return false;
}
while ((fgets(string, 256 - 1, fp)) != NULL) {
/// ここから変更
string[strlen(string) - 1] = '\0';
///ここまで変更
fputs(string, fp2);
}
fclose(fp);
fclose(fp2);
return true;
}
考え方としては、binaryモードで読み書きすることにより、
fgets,fputsでは改行文字は変更されないものと理解しております。
上記のプログラムでは、viで開くと^Mが残り、改行がなくなっております。末尾にCR+LFがあり、LFを削除しCR(^M)だけが残ったと考えると納得がいきます。
そこで、以下のように変更しました。 これで、初めのCRがLFに置き換わり、後のLFはヌル文字となり無効
になるかと期待したのですが、viで開くとなぜか^Mが残り、次の行の先頭に移っております。
挙動が理解できずどうして良いものかわかりません。
ご教授いただけると幸いです。