格式化读取提取用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、程序正常关闭,缓冲区内容也会写入文件中。