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(...);
}
}