3

このウィキペディアのページには、ファイルから最初の 5 バイトを読み取って出力するサンプル C プログラムがあります

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buffer[5] = {0};  /* initialized to zeroes */
    int i;
    FILE *fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }


    for (i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        buffer[i] = rc;
    }

    fclose(fp);

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}

私が理解していない部分はgetc、 を返し、それを s のint配列に格納する関数を使用することcharです - どうすればints をchar配列に格納できますか?

4

3 に答える 3

3

技術的には、C では、変数をそれ自体より小さいものに割り当てることで、変数を「短縮」できます。仕様は、それを行ったときに何が起こるかを正確に述べているわけではありませんが (一部のマシンでは技術的に少し奇妙なことが起こるため)、実際には、美術館の作品や非常にいくつかの作業をしない限り、使用する可能性が高いほぼすべてのマシンで特別なハードウェアの場合、大きい数値の「上位」ビットが「切り取られた」かのように単純に機能します。

そして、この特定のケースでgetcは、 は に適合するものを返すように特別に設計されcharEOFいます-1。多くの場合、charも値を持つことをサポートしている可能性があります-1が、そうであるとは限りません (charが unsigned 型の場合 - C および C++ 標準でcharは、 が可能な符号付き型であることと同等にサポートされています-1)。

于 2013-08-30T19:36:12.087 に答える
1

これをチェックしてください:-

getc() によって返された整数値が char 型の変数に格納され、整数定数 EOF と比較される場合、整数への拡張時の char 型の変数の符号拡張は実装定義であるため、比較は成功しない可能性があります。 .

于 2013-08-30T19:30:14.720 に答える
0

はい、getc() は整数を返します。ただし、特別な戻り値 EOF を除いて、戻り値は常に char の範囲内になります (デフォルトの符号付き char を持つ 2 の補数マシンでは -128 から 127)。

したがって、EOF をチェックした後は、データを失うことなく値を char 変数に転送しても常に安全です。

于 2013-08-30T19:33:48.853 に答える