-1

重複の可能性:
Cプログラミングは、画面に特定のバイト数を出力します

1つのファイル(任意のタイプ)からpartSizeのバイト数を読み取り、読み取ったのと同じ正確な量を、既に存在する新しいファイルに出力したいと思います。私が書いたプログラムは、想定よりも少なく書かれているようで、セグメンテーション違反が発生します。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h> 
#include <sys/types.h> 
#define PERMS 0777
#include <errno.h>

int main()
{

int createDescriptor;
int openDescriptorOriginal;

int closeCreateDescriptor;

char fileNameOriginal[15]="picture.jpg";
//char fileNameOriginal[15]="myFile.txt";
//char fileNameNew[15]="NEWFILE.txt";
char fileName[15]="NEWFILE.jpg";

int parts;
int partSize;

parts=2;

int bytesRemaining;
int partNumber;

char BUFFER[512];

int readDescriptor;

int openDescriptor;

if ((openDescriptorOriginal = open(fileNameOriginal, O_RDONLY )) == -1)
 {
 printf("Error opening %s", fileNameOriginal);
 exit(EXIT_FAILURE);
 }

struct stat buf;
int r = fstat(openDescriptorOriginal, &buf);
if(r)
{
fprintf(stderr, "error: fstat: %s\n",(char *)strerror(errno));

exit(1);
}

int originalFileSize=buf.st_size;

printf("The file is %d Bytes large.\n",originalFileSize);

partSize=((originalFileSize+parts)-1)/parts;
printf("Each part is %.9f Kilobytes large.\n",(double)partSize/1024 );


partNumber=1;
printf("Part number: %d\n", partNumber);

if ((openDescriptor = open(fileName, O_WRONLY )) == -1)
{
printf("Error creating %s\n", fileName);
exit(EXIT_FAILURE);
}
ssize_t count, total;
total = 0;
char *bufff = BUFFER;
while (partSize) {
   count = read(openDescriptorOriginal, bufff, partSize);
    if (count < 0) {
       // handle error
        break;
    }
    if (count == 0)
        break;
    bufff += count;
    total += count;
    partSize -= count;
}
write (openDescriptor, BUFFER, total);
printf("\n");

    return 0;
}
4

2 に答える 2

0
int bytesReceived;
.... open files ....
while ((bytesReceived = read(openDescriptorOriginal, BUFFER, sizeof(BUFFER)) > 0) {
    if (bytesReceived != write(openDescriptor, BUFFER, bytesReceived) {
        printError(...);
    }
}
于 2013-01-02T21:56:33.047 に答える
0

いくつかの初期の問題:

  • ファイルが存在しない場合に備えて、open() に CREAT フラグを追加します。
  • partSize は調整しないでください

partSize を調整する行を取り出すと、機能するはずです。

于 2013-01-02T21:55:17.230 に答える