我试图读取文件并将内容写入其他文件,但程序执行后,完成文件为空。
这是代码:
char buf[80];
int main(int argc, char *argv[])
{
int fd;
int fs;
if( (fd=open("salida.txt",O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR))<0) {
printf("\nError %d en open",errno);
perror("\nError en open");
exit(EXIT_FAILURE);
}
if( (fs=open(argv[1],O_CREAT|O_TRUNC|O_RDONLY,S_IRUSR|S_IWUSR))<0) {
printf("\nError %d en open",errno);
perror("\nError en open");
exit(EXIT_FAILURE);
}
int cont = 1;
if(fs=read(fd,&buf,80) < 0){
cont++;
if(write(fd,&buf,80) != 80) {
perror("\nError en el write");
exit(EXIT_FAILURE);
}
}
答案 0 :(得分:2)
条件
if (fs=read(fd,&buf,80) < 0)
并不意味着
if ((fs = read(fd,&buf,80)) < 0)
意味着
if (fs = (read(fd,&buf,80) < 0))
并且如果读取成功则具有覆盖文件描述符 fs
的效果,如果失败则为1。 (read
返回读取的字节数,或者失败时返回-1。)
在任何情况下,您都不希望将结果分配给fs
,因为这意味着您正在破坏写入您打开的文件的任何可能性。
另外,fd
显然是你的输出文件,所以从中读取它有点奇怪。
如果要复制(最多)80个字节,可以说类似
int size = 0;
if((size = read(fs, buf, 80)) > 0){
if (write(fd, buf, size) != size) {
perror("\nError en el write");
exit(EXIT_FAILURE);
}
}
此外,截断输入文件(O_TRUNC
)可能不是最佳选择。
答案 1 :(得分:1)
您似乎正在阅读fd
。你的代码不是很清楚,你可能想要清理它。正如其他答案所指出的那样,您的代码中存在多个错误,并且您的意图并不完全清楚。
您应该评论您的代码并正确缩进。
答案 2 :(得分:0)
int main()
{
char ch;
FILE *source, *target;
source = fopen(source_file, "r");
if( source == NULL )
{
printf("Press any key to exit...\n");
exit(EXIT_FAILURE);
}
target = fopen(target_file, "w");
if( target == NULL )
{
fclose(source);
printf("Press any key to exit...\n");
exit(EXIT_FAILURE);
}
while( ( ch = fgetc(source) ) != EOF )
fputc(ch, target);
printf("File copied successfully.\n");
fclose(source);
fclose(target);
return 0;
}
答案 3 :(得分:0)
您永远不会关闭文件。大多数操作系统实际上都不会对文件进行更改,直到您关闭它们为止。在此之前,您的更改仅在RAM中可见,而不在硬盘驱动器上。只需添加:
close(fd);
close(fs);
到代码的最后。 似乎还有一些其他问题(你为什么要从只写文件中读取并且似乎试图将相同的数据写回它),并且很难不清楚你想要完成什么
答案 4 :(得分:0)
// the following compiles, but the @include statements do expect linux
// so if your using a different OS, you may have to update them.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#define BUFFER_SIZE (80)
static char buf[ BUFFER_SIZE ]; // static so only visible in this file
// note: file scope variables are set to 0 by the startup code
int main( int argc, char *argv[])
{
int fd = -1; // destination file descriptor
int fs = -1; // source file descriptor
int statusRd = 0; // returned value from read
int statusWr = 0; // returned value from write
if( 2 > argc )
{ // then, file name parameter missing
printf( "\ncalling format: %s <filenametoread>\n", argv[0]);
exit( EXIT_FAILURE );
}
// implied else, proper number of parameters
// note: there should be a call to 'stat()'
// to assure input file exists placed here
// open destination file, uses fixed name
if( (fd = open("salida.txt", O_TRUNC | O_CREAT | O_WRONLY, S_IWRITE) ) <0)
{
printf("\nError %d en open",errno);
perror("open for write failed");
exit(EXIT_FAILURE);
}
// implied else, open of destination file successful
if( (fs=open(argv[1],O_RDONLY,S_IREAD))<0)
{
printf("\nError %d en open",errno);
perror("open for read failed");
close(fd); // cleanup
exit(EXIT_FAILURE);
}
// implied else, open of source file successful
do
{
if( (statusRd = read(fs,&buf, BUFFER_SIZE)) < 0)
{ // then read failed
perror( "read failed" );
close(fs); // cleanup
close(fd); // cleanup
exit( EXIT_FAILURE );
}
// implied else, read successful
if( 0 < statusRd )
{ // then some bytes read
if( ( statusWr = write(fd, buf, statusRd)) < 0)
{ // then, write failed
perror("\nwrite failed");
close(fs); // cleanup
close(fd); // cleanup
exit(EXIT_FAILURE);
}
}
} while( statusRd > 0 ); // exit loop when reach end of file
close(fs);
close(fd);
return(0);
}