C编程将一定数量的字节打印到文件中

C编程将一定数量的字节打印到文件中,c,file,C,File,可能重复: 我想从一个文件中读取部分大小的字节数,它可以是任何类型,并打印读取到一个已经存在的新文件中的字节数。我写的程序似乎写得比预期的要少,并且给出了一个分段错误 #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #def

可能重复:

我想从一个文件中读取部分大小的字节数,它可以是任何类型,并打印读取到一个已经存在的新文件中的字节数。我写的程序似乎写得比预期的要少,并且给出了一个分段错误

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义PERMS 0777
#包括
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”;
内部零件;
内部零件尺寸;
零件=2;
剩余的int字节数;
内部零件号;
字符缓冲区[512];
int可读描述符;
开放描述符;
if((openDescriptorOriginal=open(fileNameOriginal,O_RDONLY))=-1)
{
printf(“打开%s时出错”,fileNameOriginal);
退出(退出失败);
}
结构统计buf;
int r=fstat(openDescriptorOriginal,&buf);
if(r)
{
fprintf(stderr,“错误:fstat:%s\n”,(char*)strerror(errno));
出口(1);
}
int originalFileSize=buf.st_size;
printf(“文件大小为%d字节。\n”,原始文件大小);
零件尺寸=((原始文件尺寸+零件)-1)/零件;
printf(“每个部分的大小为%.9f千字节。\n”,(两倍)部分大小/1024);
零件号=1;
printf(“零件号:%d\n”,零件号);
if((openDescriptor=open(fileName,O_WRONLY))=-1)
{
printf(“创建%s\n”文件名时出错);
退出(退出失败);
}
ssize_t计数,总计;
总数=0;
char*buff=缓冲区;
while(零件尺寸){
计数=读取(openDescriptorOriginal、bufff、partSize);
如果(计数<0){
//处理错误
打破
}
如果(计数=0)
打破
buff+=计数;
总数+=计数;
零件尺寸-=计数;
}
写入(openDescriptor、缓冲区、总计);
printf(“\n”);
返回0;
}
一些初始问题:

  • 在open()中添加create标志,以防文件不存在
  • 零件尺寸不应调整

取出调整零件尺寸的行,它应该可以工作。

函数的
write()
返回值似乎没有检查。此外,如果您的输入文件超过512字节,您的
缓冲区将溢出。如果您希望我们学习,请缩进您的代码墙it@mah我不明白缓冲区应该有多大?@John如果你把你的代码结构保留为你提供的,缓冲区必须足够大,以容纳您处理过的最大文件。但这可能不是你想要的;通过重新构造(将
write()
调用的位置移动到保存
read()
的同一循环中),您可以使用任意大小的缓冲区(只要您在每次read()调用中重复使用缓冲区,而不是以当前的方式超越缓冲区)。@DavidHeffernan我做了ALT+k,您希望我如何缩进它?请更明确一些,仅代码示例很难理解。如果我正确理解此代码,它会复制,而bytesReceived大于0。bytesReceived在达到EOF时为0,在出现错误时为-1。这是不正确的。如果我们读取原始文件直到它到达文件的末尾,那么我们将读取整个文件。我想读取部分大小的字节数,而不是整个文件。@John我让循环读取整个文件是正确的。我相信您能够修改我的示例,以包括对限制读取大小的支持,同时仍然保持循环模式中的读/写;只需包含一个额外的转义子句,并将
sizeof(BUFFER)
中的
read()
替换为循环结束时修改的值(即
sizeof(BUFFER)
或最终数据中的较小部分。@jb其中哪一部分很难理解?内容不多,正如您所见,提问者理解得很好。如果您想解释其中的任何部分,我很乐意提供帮助,但这是一个基本的“从源代码读取,向目标代码写入,重复直到完成”环
int bytesReceived;
.... open files ....
while ((bytesReceived = read(openDescriptorOriginal, BUFFER, sizeof(BUFFER)) > 0) {
    if (bytesReceived != write(openDescriptor, BUFFER, bytesReceived) {
        printError(...);
    }
}