vc6中的文件操作是否不支持二进制文件操作,该如何解决
vc6中的文件操作是否不支持二进制文件操作
我是在VC6中进行文件操作,感觉好像vc6中不支持二进制文件的操作,代码如下:
void main()
{
FILE* fp;
FILE* fp1 = fopen( "fp1.txt ", "wb+ ");
fp = fopen( "fp.txt ", "wb+ ");
int ii = 100;
fprintf(fp, "%d ", ii);
char ch = 'a ';
fprintf(fp, "%c ", ch);
int i;
char c = 'x ';
fseek(fp,sizeof(int),0);
fscanf(fp, "%c ", &c);
printf( "%c\n ", c);
fprintf(fp1, "%c ", c);
fclose(fp);
fclose(fp1);
}
我觉得程序应该在标准输出中显示字符a,也就是从fp文件中取得的,但是显示的是x,也就是说fscanf(fp, "%c ", &c);没有成功(我测试过了,就是这一步出了问题),如果将指针定位操作fseek(fp,sizeof(int),0);改为fseek(fp,3L,0);则一切正常,能得到正确的结果。但是语句fseek(fp,3L,0);好像是根据ASIC文件(文本文件)得到的,不知道这是为什么,请高手指点。
------解决方案--------------------
支持
result = fseek(fp,sizeof(int),0);
if( result )
perror( "Fseek failed " );
else
{
// 处理
}
------解决方案--------------------
主要是因为:文本文件和二进制文件存储方式不同.
ASCII文件(文本文件):每一个字节放一个ASCII代码
二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
那么按照你两次使用fprinf写入了4个字节的数据(你所使用得是txt文本文件),分别为1,0,0,a四个字节.
当你再使用fseek(fp,sizeof(int),0);设置当前文件指针到第五个字节数据,已经超出了你写得4个字节.第5个字节是结束符.再调用fscanf()返回-1表示出错.所以c变量得值不改变.所以一直输出x.
------解决方案--------------------
二进制要用fread和fwrite来写,不要用fprintf。
------解决方案--------------------
print是打印的意思 打印出可读的字符
fopen "b " 和 没有 "b " 区别在于 二进制回车换行2个字节 "\r\n " 文本文件1个字节 "\n "
int n=1234567890;
fprintf( "%d ",n);输出到文件是1234567890占10字节 写的是个字符串
fwrite(&n,sizeof(int),1,pFile);占4字节 写的是二进制流
------解决方案--------------------
fprintf(fp, "%d ", ii);//文件中写入 0x31 0x30 0x30 ( '1 ' '0 ' '0 ')三个字符
char ch = 'a ';
fprintf(fp, "%c ", ch);//写入 'a '
文件中内容: '1 ' '0 ' '0 ' 'a '
自己用记事本打开这个文件看看吧,用UltraEdit以十六进制方式查看也可以
我是在VC6中进行文件操作,感觉好像vc6中不支持二进制文件的操作,代码如下:
void main()
{
FILE* fp;
FILE* fp1 = fopen( "fp1.txt ", "wb+ ");
fp = fopen( "fp.txt ", "wb+ ");
int ii = 100;
fprintf(fp, "%d ", ii);
char ch = 'a ';
fprintf(fp, "%c ", ch);
int i;
char c = 'x ';
fseek(fp,sizeof(int),0);
fscanf(fp, "%c ", &c);
printf( "%c\n ", c);
fprintf(fp1, "%c ", c);
fclose(fp);
fclose(fp1);
}
我觉得程序应该在标准输出中显示字符a,也就是从fp文件中取得的,但是显示的是x,也就是说fscanf(fp, "%c ", &c);没有成功(我测试过了,就是这一步出了问题),如果将指针定位操作fseek(fp,sizeof(int),0);改为fseek(fp,3L,0);则一切正常,能得到正确的结果。但是语句fseek(fp,3L,0);好像是根据ASIC文件(文本文件)得到的,不知道这是为什么,请高手指点。
------解决方案--------------------
支持
result = fseek(fp,sizeof(int),0);
if( result )
perror( "Fseek failed " );
else
{
// 处理
}
------解决方案--------------------
主要是因为:文本文件和二进制文件存储方式不同.
ASCII文件(文本文件):每一个字节放一个ASCII代码
二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
那么按照你两次使用fprinf写入了4个字节的数据(你所使用得是txt文本文件),分别为1,0,0,a四个字节.
当你再使用fseek(fp,sizeof(int),0);设置当前文件指针到第五个字节数据,已经超出了你写得4个字节.第5个字节是结束符.再调用fscanf()返回-1表示出错.所以c变量得值不改变.所以一直输出x.
------解决方案--------------------
二进制要用fread和fwrite来写,不要用fprintf。
------解决方案--------------------
print是打印的意思 打印出可读的字符
fopen "b " 和 没有 "b " 区别在于 二进制回车换行2个字节 "\r\n " 文本文件1个字节 "\n "
int n=1234567890;
fprintf( "%d ",n);输出到文件是1234567890占10字节 写的是个字符串
fwrite(&n,sizeof(int),1,pFile);占4字节 写的是二进制流
------解决方案--------------------
fprintf(fp, "%d ", ii);//文件中写入 0x31 0x30 0x30 ( '1 ' '0 ' '0 ')三个字符
char ch = 'a ';
fprintf(fp, "%c ", ch);//写入 'a '
文件中内容: '1 ' '0 ' '0 ' 'a '
自己用记事本打开这个文件看看吧,用UltraEdit以十六进制方式查看也可以