2

ファイルの内容をchar配列に書き込もうとしてfread()いますが、うまくいかないようです。これは、私が実装しているプログラムの一部です。各ステップで正しい出力が得られるかどうかを確認するために、多くのトレース ステートメントを含めました。それらはすべて完璧に見えます。はfileSize正しく出ます。のサイズsendFileBufもちゃんと出ます。whileループに入ると、値が約 62000printfであっても、ステートメントは 2 回しか実行されません。いくつかのファイルで試してみましたが、常にエラーが発生します。私を助けてください!fileSizesendFileBufÿØÿá

void sendFile(fileNode fileToSend, int sockFd)
{
    int fileSize;

    fileSize = atoi(fileToSend.fileSize);
    printf("file size after conversion to int: %d\n", fileSize);

    //Sending file size
    if(send(sockFd, fileToSend.fileSize, sizeof(fileToSend.fileSize), 0) < 0)
    {
        perror("Sending file size");
        close(sockFd);
        exit(1);
    }

    //Send actual file
    FILE *newFp;
    char path[50];
    strcpy(path, "SharedFiles/");
    strcat(path, fileToSend.fileName);

    if((newFp = fopen(path, "r")) == NULL)
    {
        perror("Opening file");
        exit(1);
    }

    //Write file to buffer and send
    char sendFileBuf[fileSize];
    memset(&sendFileBuf, 0, sizeof(sendFileBuf));
    printf("Size of sendfilebuf: %ld", sizeof(sendFileBuf));

    fread(&sendFileBuf, 1, fileSize, newFp);

    printf("sending file buffer %s\n", sendFileBuf);
    if(send(sockFd, sendFileBuf, sizeof(sendFileBuf), 0) < 0)
    {
        perror("Sending file");
        fclose(newFp);
        close(sockFd);
        exit(1);
    }
}
4

3 に答える 3

2

呼び出しを含む while ループは、意図したfreadとおりに実行されない可能性があります。1 回の呼び出しですべてを読み取れなかった場合、2 回目の呼び出しでデータがバッファーの先頭に読み込まれます (最初の反復で書き込まれたものは上書きされます)。

たとえば、バッファーが 10 バイトで、読み取るデータが次のとおりであるとします。

1234567890abcde

最初のループは、最初の 10 文字を読み取ります ( 1234567890)。2 回目の反復abcdeでは、バッファの先頭が読み込まれます。その後、バッファには以下が含まれます。

abcde67890

その場合、バッファには null ターミネータはありません (読み取ったばかりのデータにゼロが含まれていないと仮定します)。そのため、printf には、バッファの終わりを過ぎたデータが含まれる可能性があります。

于 2012-12-08T02:48:33.673 に答える
0

誰もこれを尋ねていないので、ここに行きます: あなたは、関数が「」のような奇妙な文字で出てくると言いますÿØÿá

それらのキャラクターが奇妙だと思う理由は何ですか?読み込もうとしているのは、どのような種類のファイルですか? テキストファイルですか?それともMP3?それとも画像ファイル?それともまったく別の何か?

多くのファイルには人間が判読できないデータが含まれているため、画面に表示される内容は完全に有効な場合があります。文字列ではない可能性のあるファイルの内容を (文字列として) 印刷しています。

于 2012-12-08T05:34:28.047 に答える
0

式で使用するsendFileBufと、ポインターに減衰するため、逆参照する必要はありません&。このようにしてみてください:

fread(sendFileBuf, 1, fileSize, newFp);

と同じことmemset()

memset(sendFileBuf, 0, sizeof(sendFileBuf));
于 2012-12-08T02:29:48.013 に答える