0

私はCプログラミングの初心者です。クライアントがサーバーからファイルをコピーする関数を書いています。ただし、新しく作成したファイルを開くと、多くの追加文字が含まれています。無駄なデータをコピーしないようにするにはどうすればよいですか?

サーバーの関連セクションは次のとおりです

            if (file = fopen(buf, "r")){                
            //send the file     
//              while(fgets(buffer, 1024, file) != NULL){
//                  res = write(new_fd, &buffer, sizeof(buffer));
//              }

            while(!feof(file)){
                fscanf(file,"%s",buffer);
                write(new_fd, &buffer, sizeof(buffer));
            }               
            fclose(file);               
        }

クライアントの関連セクションは次のとおりです

        fp = fopen ("testfile", "w");

        while(read(sockfd, &buffer, sizeof(buffer)) != -1){
            fputs(buffer, fp);
        }
        fclose(fp);
4

2 に答える 2

2

2つのこと:最初にやらないwhile (!feof(...))でください。期待どおりに機能しません。その理由は、読み取り操作が失敗するまで EOF フラグが設定されないためです。そのため、ファイルが既に最後に達したときに 1 回呼び出しますfscanf。代わりにwhile (fscanf(...) == 1)

次に、 の宣言方法によっては、またはbufferを使用しないでください。送信者でも受信者でもありません。がポインターの場合、そのポインターへのポインターを返し、ポインターが指すものではなく、ポインターのサイズを返します。さらに、が配列の場合、入力によって完全に埋められない可能性があるため、必要のないデータを送信する必要はありません。バイトのみを送信します (は文字列ターミネータ用です)。&buffersizeof(buffer)buffer&buffersizeof(buffer)bufferstrlen(buffer) + 1+1

ああ、3番目にfscanf、行を読むために使用しないでくださいfgets。代わりに使用してください。または、より効果的にするには、 を使用freadして完全なバッファーを埋め、より少ない呼び出しですべてを送信します。

于 2013-11-10T16:18:26.770 に答える