首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

资料读写函数的一些不同的使用方法

2013-08-13 
文件读写函数的一些不同的使用方法。各位好~最近一直在搞那个文件加解密系统,最近在研究文件读写函数,如下

文件读写函数的一些不同的使用方法。
各位好~
最近一直在搞那个文件加解密系统,最近在研究文件读写函数,如下面事例:
1.cpp

#include <stdio.h>
int main (void)
{
size_t result;
char buf[512];
FILE * fp1 = fopen ( "f.mp3", "rb" );
FILE * fp2 = fopen ( "1.mp3", "wb+" );
while ( ( result = fread ( buf, sizeof(char), 512, fp1 ) ) > 0 )
{
if ( fwrite ( buf, sizeof(char), result, fp2 ) < result )
{
printf("fail to write\n");
return 1;
}
if( result == -1)
{
printf("fail to read\n");
return 1;
}
}
fclose( fp1 );
fclose( fp2 );
return 0;
}

2.cpp
#include <stdio.h>
int main (void)
{
size_t result;
int buf[512];
FILE * fp1 = fopen ( "f.mp3", "rb" );
FILE * fp2 = fopen ( "2.mp3", "wb+" );
while ( ( result = fread ( buf, sizeof(int), 512, fp1 ) ) > 0 )
{
if ( fwrite ( buf, sizeof(int), result, fp2 ) < result )
{
printf("fail to write\n");
return 1;
}
if( result == -1)
{
printf("fail to read\n");
return 1;
}
}
fclose( fp1 );
fclose( fp2 );
return 0;
}

上面的代码虽然有【警告: 在有符号和无符号整数表达式间比较 [-Wsign-compare]】,但是代码可以正确复制f.mp3文件到1.mp3和2.mp3。
代码的区别是buff的类型不同,一个是char,另外一个是int。就算改成bool代码都是可以运行的。我下面贴出运行有问题的代码:
3.cpp
#include <stdio.h>
int main (void)
{
size_t result;
bool buf[512];
FILE * fp1 = fopen ( "f.mp3", "rb" );
FILE * fp2 = fopen ( "3.mp3", "wb+" );
while ( ( result = fread ( buf, sizeof(bool)*512, 1, fp1 ) ) > 0 )
{
if ( fwrite ( buf, sizeof(bool)*512, result, fp2 ) < result )
{
printf("fail to write\n");
return 1;
}
if( result == -1)
{
printf("fail to read\n");
return 1;
}
}
fclose( fp1 );
fclose( fp2 );
return 0;
}



代码区别主要有两点,一个是bool,另外一个是fwrite和fread的参数区别,这样运行只是复制了文件前512字节的最大倍数,即源文件后不足512字节被截断了。(我用播放器播放,文件是可以播放的,从侧面证明文件的一复制部分是对的)
我感觉这里涉及到文件对齐和文件系统之类的问题,fread和fwrite的机制到底是怎么样呢?难道前面1.cpp和2.cpp就不会出现文件对齐的问题么?假设有一个文件的大小就刚刚好不是int,char的倍数呢,例如777.7字节,上面的两个函数会不会出错?
针对char来说,程序能否复制前777字节的内容,但是后面那0.7字节它是如何储存在char类型的buff里面呢?把0.7字节大小的内容存在1字节的buff上,然后又把这1字节的buff内容写去另外一个文件,那它怎么只要只复制0.7的内容而不是0.8或者整个1字节的呢?这样不会生成的文件的总大小就变成了一个整数了呢? c
[解决办法]
文件都是以字节为单位,不可能出现0.7字节的内容。
你写1个只有1个字节的二进制文件。
然后几种方式都试一下,看看复制的文件和原文件的对比。
[解决办法]
引用:
Quote: 引用:

文件都是以字节为单位,不可能出现0.7字节的内容。
你写1个只有1个字节的二进制文件。
然后几种方式都试一下,看看复制的文件和原文件的对比。

你好,那你能够针对下面代码不能完整复制文件的原因讲解一下么?
FILE * fp1 = fopen ( "f.mp3", "rb" );
    FILE * fp2 = fopen ( "3.mp3", "wb+" );
    while ( ( result = fread ( buf, sizeof(bool)*512, 1, fp1 ) ) > 0 )
    {
        if ( fwrite ( buf, sizeof(bool)*512, result, fp2 ) < result )
        {
            printf("fail to write\n");
            return 1;
        }
        if( result == -1)
        {
            printf("fail to read\n");
            return 1;
        }
    }
    fclose( fp1 );
    fclose( fp2 );

就是大概说一下嘛。




  while ( ( result = fread ( buf, sizeof(bool)*512, 1, fp1 ) ) > 0 )


    {
        if ( fwrite ( buf, sizeof(bool)*512, result, fp2 ) < result )
 
// fread返回1表示读取了size字节,返回0表示读取数量不够size字节,
//究竟是多少不知道!!-----------------确实是这样的!


[解决办法]
引用:
Quote: 引用:

文件都是以字节为单位,不可能出现0.7字节的内容。
你写1个只有1个字节的二进制文件。
然后几种方式都试一下,看看复制的文件和原文件的对比。

你好,那你能够针对下面代码不能完整复制文件的原因讲解一下么?
FILE * fp1 = fopen ( "f.mp3", "rb" );
    FILE * fp2 = fopen ( "3.mp3", "wb+" );
    while ( ( result = fread ( buf, sizeof(bool)*512, 1, fp1 ) ) > 0 )
    {
        if ( fwrite ( buf, sizeof(bool)*512, result, fp2 ) < result )
        {
            printf("fail to write\n");
            return 1;
        }
        if( result == -1)
        {
            printf("fail to read\n");
            return 1;
        }
    }
    fclose( fp1 );
    fclose( fp2 );

就是大概说一下嘛。


你的三个程序,只有第一个能完全复制,第二和第三都有问题。
当文件最后一部分不满足1个int或者1个bool[512]的长度时,最后的部分不会被复制。
你用的音乐文件,最后部分差一点感觉不到。用txt文件就很明显了。

热点排行