2016-12-09 1 views
2

私は現在、3つの引数、2つのファイル(1つの入力と1つの出力)、int(出力行の最大長、xと呼ぶ)をとるcプログラムを書いています。私は、入力ファイルのすべての行を読み込み、最初のx文字を出力ファイルに書き込む(効果的にファイルをトリミングする)。ここでC:UTF-8以外の文字が生成されないようにするにはgetcを使用するには?

は私のコードです:

int main(int argc, char *argv[]) { 

    const char endOfLine = '\n'; 

    if (argc < 4) { 
    printf("Program takes 4 params\n"); 
    exit(1); 
    } else { 
    // Convert character argument [3] (line length) to an int 
    int maxLen = atoi(argv[3]); 

    char str[maxLen]; 
    char *inputName; 
    char *outputName; 

    inputName = argv[1]; 
    outputName = argv[2]; 

    // Open files to be read and written to 
    FILE *inFile = fopen(inputName, "r"); 
    FILE *outFile = fopen(outputName, "w"); 

    int count = 0; 
    char ch = getc(inFile); 
    while (ch != EOF) { 
     if (ch == '\n') { 
      str[count] = (char)ch; 
      printf("Adding %s to output\n", str); 
      fputs(str, outFile); 
      count = 0; 
     } else if (count < maxLen) { 
      str[count] = ch; 
      printf("Adding %c to str\n", ch); 
      count++; 
     } else if (count == maxLen) { 
      str[count] = '\n'; 
     } 
     ch = getc(inFile); 
    } 

    } 

    return 0; 
} 

唯一の問題は、最後の文字が単一引用符であれば、それはのような、非UTF-8文字を出力していることである:

For Whom t 
John Donne 
No man is 
Entire of 
Each is a 
A part of 
If a clod 
Europe is 
As well as 
As well as 
Or of thin 
Each man�� 
For I am i 
Therefore, 
For whom t 
+3

配列をオーバーフローさせた 'else if(count == maxLen)'セクションで未定義の動作があります。 – paddy

+1

シングルバイト文字を含むデータストリームの非UTF8文字とは何ですか? – bvj

+0

@bvj 0-127の範囲にない8ビットの 'char'は、正しくコード化されたUTF8コードポイントではありません。 – chux

答えて

1

最後のchar出力がutf-8の連続したバイトであるかどうかを確認することができます。10xxxxxxの場合、文字が完成するまで出力を続けます。

// bits match 10xxxxxx 
int is_utf_continue_byte(int ch){ 
    return ch & 0x80 && ~ch & 0x40; 
} 

//... 
while (is_utf_continue_byte(ch)) 
    putchar(ch), ch = getchar(); 
+0

どうすればいいですか? – rafro4

+0

まず '' ch''を 'int'にして' EOF'の比較が正しければ 'while(ch&0x80 &&ch&0x40)putchar(ch)、ch = getchar();'これはビット7 1( 'ch&0x80')で、ビット6は0(' ~ch&0x40')です。 utf-8形式の場合、このパターンには連続したバイトだけが当てはまります。 –

+0

なぜ '(ch&0xC0)== 0x80'ではなく、(ch&0x80 &&〜ch&0x40)より紛らわしいのですか?なぜループ内のブレースを避けるのですか? – immibis

関連する問題