文件操作函数
打开文件:fopen(文件名,使用文件方式)
关闭文件:fclose( fp )
文件读取:fgetc( fp )
,fgets(str, n, fp)
,fscanf(fp, 格式, 输入列表)
,fread(存储区指针, 单元大小, 个数, 文件指针)
文件写入:fputc( ch, fp )
,fputs(str, fp)
,fprintf(fp, 格式, 输出列表)
,fwrite(存储区指针, 单元大小, 个数, 文件指针)
其他:feof( fp )
,rewind( fp )
,fseek(fp, 偏移量, 起始点)
关于fopen
:只读用“r”,只写用“w”,若后面要使用fread或fwrite,则用“rb”或“wb”
关于fgets
:实际读入n-1个字符,并在str[n-1]处放入’\0’
关于fseek
:偏移量为长整型,如"-10L"表示向后10个字节;起始点有三种,0表示文件开头,1表示当前位置,2表示文件结尾,例如想读入最后一个字节,可以这样定位:fseek(fp, -1L, 2)
对比记忆,标准输入输出:
标准输入:getchar()
, gets(字符数组)
标准输出:putchar(ch)
情景一:每行是空格分隔的整数,且个数不确定(fgets例子)
示例文本:
3 -5 2 -1
6 8 -2
-4 7 9 -3 6
参考程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
int main(){
//打开文件
FILE *frp = fopen("D:\\in.txt", "r");
if(frp==NULL){
printf("cannot open file!\n");
exit(1);
}
//读取文件并打印
char str[N];
while (!feof(frp))
{
fgets (str, N, frp);
char *p;
int num=0;
//空格与回车都作为分隔符
for (p = strtok(str, " \n"); p; p = strtok(NULL, " \n")) {
//sscanf(p,"%d",&num);
num=atoi(p);
printf("%d ",num);//每行末尾会多个空格
}
printf("\n");//末尾多了个回车
}
//关闭文件
fclose(frp);
return 0;
}
结果截图:
情景二:每行是空格分隔的整数,且第一个数字为该行剩下的数字个数(fscanf例子)
示例文本:
5 10 -20 2000 36 -100
3 -10 60 300
4 70 88 12 66
参考程序:
#include <stdio.h>
#include <stdlib.h>
int main(){
/*打开文件*/
FILE *frp=fopen("D:\\in.txt","r");
if(frp==NULL){
printf("cannot open file");
exit(1);
}
/*读取文件并打印*/
int len;
while(!feof(frp)){
len=0;
fscanf(frp,"%d",&len);
int *arr=(int *)malloc(sizeof(int)*len);
for(int i=0;i<len;i++){
fscanf(frp,"%d",arr+i);
}
for(int i=0;i<len;i++){
printf("%d ",arr[i]);//每行末尾会多个空格
}
printf("\n");//末尾多了个回车
free(arr);
}
/*关闭文件*/
fclose(frp);
return 0;
}
结果截图: