1

末尾の ^M / Windows の最後の文字を削除するコードをご存知ですか?

 2147 int convert_dos_to_unix( char *fileread ) {
 2148   int i ;
 2149   FILE *fp ;
 2150   char line[PATH_MAX];
 2151     fp = fopen( fileread ,  "r");
 2152     while( ( !feof(fp) )   ) {
 2153        if ( !feof(fp)) {
 2154           fgets(line, PATH_MAX, fp); printf ( "%s" , line);
 2155           i++;
 2156         }
 2157       }
 2158     fclose( fp );
 2159     return i ;
 2160 }
 2161 

ミニーさんありがとう

4

2 に答える 2

1

Windows では、2 つの文字シーケンス\r\n(キャリッジ リターン + 改行、改行) が使用されます。

あなたのコードは実際には行ごとに読むのではなく、チャンクごとに読むことに注意してください。行ごとに作業したい場合は、glibc で利用可能な GNU 拡張であるgetline()(「参考文献」を参照) を参照してください。man 3 getline標準 C ではありませんが、glibc は標準の Linux C ライブラリです。

もちろん、を取り除くためにそれを行う必要はありません\r。あなたが持っているものに固執することができますが、各チャンクを取り、次のことを行います。

char *p = strchr(line, '\r');
while (p) {
    *p = '\0';
    strcat(line, ++p);
    p = strchr(p, '\r');
}

これは an を見つけて\rに置き換え、 1 文字\0進めます。pはを\0切り捨てlinep追加し、 を削除して、検索する s\0がなくなるまで、繰り返しごとに文字列全体を 1 つずつ短縮\rします。

于 2013-09-22T17:05:09.617 に答える
0

DOS ファイルには、キャリッジ リターン ライン フィードの CRLF 文字があり\r\n、 で表され^Mます。あなたがしなければならないことは、このキャラクターを行末近くから取り除くことだけです。

追記:キャラ追加\n。ありがとうゴルディロックス。

于 2013-09-22T17:04:54.553 に答える