2

freadステートメントを適切にフォーマットする方法を理解するのに問題があります。以下のコードは、Imが練習しているランダムなものです。基本的には、最初の配列(s)に情報を入力し、ファイルに「s」を書き込んでから、ファイルを2番目の配列(s2)に読み取ります。ただし、エラーが発生したり、ガベージが返されたりしないようにfreadステートメントをフォーマットすることはできないようです。私の理解が正しければ、charは他のデータ型よりも少ないメモリを使用するため、配列はcharデータ型になっています。この練習コードの最終的なアプリケーションは、データ圧縮プロジェクト用です。

#include<stdio.h>
#include<string.h>

FILE *fp;
//file pointer

char s[56];
//first string

char s2[56];
//target string for the fread

int n=0;
//counting variable

int m=0;

int main (void)
{
    fp=fopen("test.bin", "w+");
    //open a file for reading and writing


    strcpy(s, "101010001101010");
    //input for the string

    for(n=0;n<56;n++)
    {
        if(s[n]==1)
            m=n;
        else if(s[n]==0)
            m=n;
    }
    printf("%d\n", m);
    //the above for loop finds how many elements in 's' are filled with 1's and 0's
    for(n=0;n<m;n++)
    {
        printf("%c", s[n]);
    }
    //for loop to print 's'


    fwrite(s, m, 1, fp);
    //writes 's' to the first file
    s2=fread(&s2, m, 1, fp);
    //an attempt to use fread...

    printf("\n\ns2\n\n");
    for(n=0;n<m;n++)
    {
        printf("%c", s2[n]);
    }
    printf("\n");
    //for loop to print 's2'
    fclose(fp);

    printf("\n\n");
    printf("press any number to close program\n");
    scanf("%d", &m);
}
4

2 に答える 2

5

FILE 構造体には、ファイル内の暗黙的なシーク位置があります。そのシーク位置から読み書きします。書き込んだ内容を読みたい場合は、 を呼び出してシーク位置をファイルの先頭に戻す必要がありますfseek()fseek()実際、読み取りと書き込みのために開いているファイルの場合、読み取りと書き込みを切り替えるときに呼び出す必要があります。

于 2013-01-16T15:28:13.137 に答える
1

関数の戻り値のfread型はsize_tです。正常に読み取られた要素の数です。(参考:http ://www.cplusplus.com/reference/cstdio/fread/ )

s2 に割り当てないでください。単に使用するfread(&s2, m, 1, fp);

于 2013-01-16T15:28:58.760 に答える