C编程基础day13

格式化读取提取用sscanf函数。

格式化输入用ssprintf函数。

fprintf函数将内容写到文件中,fprintf(fp,"%d\n",num);

fscanf函数从文件中读取内容, fscanf(fp,"%d\n",&num);  //如果读到的格式不是“%d\n”的格式时候会出错,提前结束读取。

研究以下代码,在fp文件最后有多个换行符的时候为什么没有继续打印num,而是直接跳出了。  这点和fgets有区别

while(1)

{

     fscanf(fp,"%d\n",&num);

     printf("num=%d\n",num);

     if(feof(fp))

     {

            break;

     }

}

fgetc fputc按字符读取

fgets fputs 按行读取

fscnaf fprintf 按格式读取

fread fwrite 按块读写文件

size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE * stream);

ptr:准备写入文件的数据地址

size: 数据块的大小

nmemb: 数据块数目, 写入的字节=数据块大小* 数据块数目。

stream :已经打开的文件指针

返回值:

    成功:实际成功写入文件数据块数目,此值和nmemb相等。

    失败: 返回0.

举例

int a=10

fwrite( &a,  4, 1, fp); 和 fwrite( &a,  1, 4, fp); 及 fwrite( &a,  2, 2, fp);等价

size_t fread( const void *ptr, size_t size, size_t nmemb, FILE * stream);

ptr:存放读取出来数据的地址

size: 数据块的大小

nmemb: 数据块数目, 读取的字节=数据块大小* 数据块数目。

stream :已经打开的文件指针

返回值:

    成功:实际成功读取到内容的数据块数目,此值比nmemb小 但大于0说明读到了内容。

    失败: 返回0.

typedef struct Student

{

     int  age;

     char name[52];

     int score;

}Student;

假设fp文件中存储了四个Student 结构体。

Student s[10];

int ret = 0;

ret=fread(s,sizeof(Student),2,fp); //此时ret值为2,因为用户指定为读取2块。

ret=fread(s,sizeof(Student),10,fp); //此时ret值为4,因为文件中存储了4个Student结构体全读取出来了, 读取的字节大小为4*sizeof(Student)。

ret=fread(s,sizeof(s),1,fp); //此时ret值为0,因为文件中存储了4个Student结构体,单数读取的块大小为10个Student,读取了0.4个, ret为整型0.4变为了0。ret=0不能判断读取情况。

为了让fread和fwrite返回值既能真实返回读取或写入的字节数,也能真实反应读取或写入是否失败, fwrite和fread函数第二个参数数据块大小一般写为1字节。

ret = fread(s,1, sizeof(s), fp);

C语言实现cp拷贝命令

if(argc!=3)

{

    printf("main argc error\n");

    return;

}

srcFp = fopen(argv[1],"r");

dstFp = fopen(argv[2],"w");

char buf[4*1024];

int len =0;

while(1)

{

    len = fread(buf,1,sizeof(buf),srcFp); /*每次最多拷贝4k字节*/

    if(len==0)

    {

        break;

    }

    fwrite(buf,1,len,dstFp);

}

fclose(srcFp);

fclose(dstFp);

在终端输入 ./ a.out  1.mp4 2.mp4 即可

但是以上代码在windows下执行会出错,因为windows下fopen函数第二个参数处理非文本文件要用'rb" "wb"等,若是不加字符"b",就会把文件当文本来处理。 所以为了保证两个平台都能用,以后最好都加上字符b.

srcFp = fopen(argv[1],"r");

dstFp = fopen(argv[2],"w");

另外windows下直接在main函数下第一行输入argc =3; argv[1]="1.mp4"; argv[2]="2.mp4"; 然后编译运行即可。

windows和linux的文本文件的区别

b是二进制的意思,b只是在windows下有效,在linux下r和rb的效果一样。

windows平台下文本文件换行符为\r\n, 而linux平台下文本的换行符为\n. 有些时候文件在windows下会多几个字符。

在windows下以文本形式打开文件,即不加b

    1、当读取文件的时候,系统会将所有的"\r\n"自动转化为“\n”

    2、当写入文件的时候,洗红会将所有的"\n"自动转化为"\r\n"

windows下以二进制形式打开文件,则读写都不会转换。

linux下二进制形式和文本形式没有区别,"\r\n"作为两个字符原样输出。

int fseek(FILE* stream, long offset, int whence)移动光标的读写位置

whence三个特殊值意义如下:

SEEK_SET,从文件开头移动offset个字节。

SEEK_CUR,从当前位置移动offset个字节。

SSEK_END, 从文件末尾移动offset个字节。

fseek(fp, 0, SEEK_SET); 在开头偏移0个字节,回到开头

fseek(fp,100,SEEK_SET);在开头向右偏移100个字节

fseek(fp, 0, SEEK_CUR); 在当前位置偏移0个字节

fseek(fp,100,SEEK_CUR);在当前位置向右偏移100个字节

fseek(fp,-100,SEEK_CUR);在当前位置向左偏移100个字节

fseek(fp, 0, SEEK_END); 在结尾偏移0个字节,移动到最后

long ftell(FILE *fp);获取当前光标到文件最开始的大小。 当光标位于结尾的时候可以用来计算文件大小。

void rewind(FILE *fp); 把光标移动到文件的最开始的地方。

int stat(const char *path, struct stat *buf); //无需打开文件就可以获取文件的属性。

int remove(const char *pathname); //删除文件

int rename(const char *oldpath, const char *newpath);重命名

文件缓冲区:

ANSI C标准采用“缓冲文件系统”处理文件。

1、正常情况下(程序没有结束,也没有关闭文件)缓冲区满会写到文件中

2、文件正常关闭,缓冲区内容也会写到文件中 fclose(fp);

3、int fflush(FILE *stream); 更新缓冲区,缓冲区不满也立马写到文件中。

4、程序正常关闭,缓冲区内容也会写入文件中。

猜你喜欢

转载自blog.csdn.net/Shayne_Lee/article/details/81841627