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

为什么小弟我的这个程序没有将 fread 后的字符串输出来

2013-07-01 
为什么我的这个程序没有将 fread 后的字符串输出来?我的这个程序应该有字符串输出才是,但是运行的结果是16

为什么我的这个程序没有将 fread 后的字符串输出来?
我的这个程序应该有字符串输出才是,但是运行的结果是16 bytes at byte 10: (null)/nPress any key to continue
出现了null的结果,但我的原文件123里面是有很长的内容的。


#include "stdafx.h"
#include <string.h>
#include <stdio.h>
int main( void )
{
   FILE   *fp;
   fpos_t pos;
   char   buffer[50];
  fp = fopen("f:\\123.txt", "r+");
if(fp == NULL)
{
printf("Trouble opening file/n");
}
else
   {
     
  pos = 10;
     
  if( fsetpos( fp, &pos ) != 0 )
  {
perror( "fsetpos error" );
  }
        
          else
          {
               
fread( buffer, sizeof( char ), 16, fp );               
printf( "16 bytes at byte %d: %.16s/n", pos, buffer );
          }
      }
   fclose( fp );
return 0;
}

[解决办法]
用fseek吧,fpos_t不保证是整型:

#include <string.h>
#include <stdio.h>
int main( void )
{
   FILE   *fp;
   char   buffer[50];
  fp = fopen("123.txt", "r+");
    if(fp == NULL)
    {
        printf("Trouble opening file/n");
    }
    else
   {
          fseek( fp, 10L, SEEK_SET );
          fread( buffer, sizeof( char ), 16, fp );               
          printf( "16 bytes at byte %d: %.16s/n", 10, buffer );
      }
   fclose( fp );
    return 0;
}

[解决办法]
遇到让他停止读的东西了,还没读满就停了
[解决办法]
//改成这样也可以
printf( "16 bytes at byte %d: %.16s/n", (int)pos, buffer ); 
[解决办法]


小心驶得万年船。
请检查每个函数的返回值!
参考下面:

#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_CLU_BYTES 65536
FILE *fo;
int fh;
__int64 offs,offs1;
__int64 rvi64;
int rv,wrv;
unsigned char buf[MAX_CLU_BYTES];
char ofn[_MAX_PATH];
char offstr[80];
void strcpybutcomma(char *t,char *s) {
    char c;

    while (1) {
        c = *s++;
        if (','!=c) *t++ = c;
        if (0==c) break;
    }
}
void main(int argc,char **argv) {
    if (argc<3) {
        printf("Copy File Tail.\n");
        printf("Usage:\n");
        printf("    cft filename.ext offset_begin[-offset_end]\n");
        printf("Copy filename.ext offset_begin[-offset_end] to offset_begin[-offset_end]-filename.ext\n");
        printf("Note: Byte at offset_end is NOT included.\n");
        printf("Example:\n");
        printf("    cft abc.rar 12345\n");
        printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");
        printf("    cft abc.rar 123-12345\n");
        printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");
        printf("    cft abc.rar 0xAB-0xCD\n");
        printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");
        return;
    }
    strcpybutcomma(offstr,argv[2]);
    rv=sscanf(offstr,"%I64i-%I64i",&offs,&offs1);
    if (rv==0) {
        printf("offset %s is not number\n",argv[2]);
        return;
    }
    fh=_sopen(argv[1],_O_BINARY
[解决办法]
_O_RDONLY
[解决办法]
_O_RANDOM,_SH_DENYWR);
    if (fh==-1) {
        printf("_sopen %s errno=%d\n",argv[1],errno);
        return;
    }
    if (rv==1) {
        offs1=_filelengthi64(fh);
        if (offs1==-1i64) {
            printf("%I64=_filelengthi64 errno=%d\n",offs1,errno);


            _close(fh);
            return;
        }
    } else {//rv==2
        if (offs1<offs) {
            printf("%s offset_begin>offset_end error\n",argv[2]);
            _close(fh);
            return;
        }
    }
    rvi64=_lseeki64(fh,offs,SEEK_SET);
    if (rvi64!=offs) {
        printf("%I64u=_lseeki64 %I64u errno=%d\n",rvi64,offs,errno);
        _close(fh);
        return;
    }
    sprintf(ofn,"%s-",offstr);
    strcat(ofn,argv[1]);
    fo=fopen(ofn,"wb");
    if (fo==NULL) {
        _close(fh);
        printf("fopen %s error\n",ofn);
        return;
    }
    cprintf("\n%I64u\r",offs);
    while (1) {
        rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));
        if (rv==0) break;//
        if (rv<0) {
            fclose(fo);
            _close(fh);
            printf("_read %s offset %I64u error\n",argv[1],offs);
            return;
        }
        wrv=fwrite(buf,1,rv,fo);
        if (wrv!=rv) {
            fclose(fo);
            _close(fh);
            printf("fwrite %s error\n",ofn);
            return;
        } else {
            offs+=rv;
            cprintf("%I64u\r",offs);
            if (offs>=offs1) break;//
        }
    }
    fclose(fo);
    _close(fh);
    printf("Copy %s offset %s to %s OK.\n",argv[1],argv[2],ofn);
}


[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待


弄混了

热点排行