一.控制台与文件内容之间的转换。
注:下面的fopen,freopen,feof,fscanf,fprintf等函数都在stdio.h头文件里。
1.控制台——文件
@1.fopen 函数(涉及到的函数:fscanf, fprintf, fputs, fgets 等)
FILE *fp;// FILE 是文件类型的声明,fp即为指向文件的指针。
fp=fopen(“C:\\Users\\CB1030205454\\Desktopr\\data.dat”,”a+“);//fp=fopen(“路径及文件名称”,”打开方式“);fopen函数原型为FILE * fopen(const char * path, const char * mode);
if(fp==NULL)
{puts("打开文件失败!");
return -1;
}
scanf("%s",a);//int a[40]
fprintf(fp,"%s",a);
同理
while(!feof(fp))判断是否已读到文件末尾,
{
fscanf(fp,"%s",b);//int b[40]
}
printf("%s",b);
fclose(fp);//文件操作结束时别忘了关闭指针!
**
!!!P.S:在使用fscanf读取文件时,特别是连续读取不同类型变量的时候,最好同时在文件和fscanf里面用同样多的空格隔开,(其他类型变量也可以用“,” “|”之类的隔开,但字符串数组型只能用相应的空格隔开),这样才能避免读取出错。
P.S.:至于相对路径与绝对路径的问题:
相对路径:文件名(默认为其与源文件,头文件在同一目录及文件夹下);eg:”data.txt“或“12\\data.txt”(其中12为临近的上一文件夹)。
绝对路径:路径+文件名;eg:“C:\\Users\\CB1030205454\\Desktopr\\data.txt”。
@2.freopen函数(可以正常使用scanf,printf等函数)
freopen(“data.dat”,”w“,stdout);//重定向,输出数据到文件。
scanf("%s",a);// char a[40]
printf("%s",a);//输出数据到文件
freopen("CON","w",stdout);//重定向,输出数据再次到控制台。
freopen(“C:\\Users\\CB1030205454\\Desktopr\\data.dat”,”r“,stdin);//重定向,读取文件中的数据。
scanf("%s",a);// char a[40]//读取文件中的数据
printf("%s",a);//在控制台上输出数据
freopen("CON","r",stdin);//重定向,在控制台上读取数据。
具体文件操作如下:
r 以只读方式打开文件,该文件必须存在。
r+ 以读/写方式打开文件,该文件必须存在。
rb+ 以读/写方式打开一个二进制文件,只允许读/写数据。
rt+ 以读/写方式打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文 件不存在则创建该文件。
w+ 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
a 以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
a+ 以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
wb 以只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 以读/写方式打开或新建一个二进制文件,允许读和写。
wt+ 以读/写方式打开或新建一个文本文件,允许读和写。
at+ 以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+ 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
二.判断文件读取结束的方法。
1.使用EOF(遇到int型没问题,char型可能有问题(字符“FF”会误判为文件结束))
int c;
int a[100]
while((c=fgetc(fp))!=EOF)
{
fscanf(“%c”,a);
}
2.feof函数
char c;
while(!fgetc(fp))
{
fscanf(fp,"%c",&c);
printf("%c",c);
}
三.多文件项目的建立
主要分为:main函数,分函数,头文件。
如:main.c; funs.c; txt.h;
1.main.c:主要是包含的头文件和主函数。
2.funs.c: 头文件和各个功能函数。
3.txt.h:宏定义,结构体,函数名,数组等的声明。
eg:
txt.h:
#ifndef TXT_H_INCLUDED//ifndef...endif 是为防止重复定义。
#define TXT_H_INCLUDED
#define N 100
typedef char TYPE;
TYPE a[N],b[N];
void print();
void scan();
#endif //TXT_H_INCLUDED
funs.c :
#include"txt.h"
#include<stdio.h>
void print()
{
FILE *fp;
fp = fopen("C:\\Users\\CB1030205454\\Desktop\\putfs.txt", "a+");
if (fp == NULL)
{
puts("文件读取失败!");
return -1;
}
scanf(" %s", a);
fprintf(fp ,"%s",a);
fclose(fp);
}
main.c :
#include<stdio.h>
#include"txt.h"
int main()
{
print();
system("pause");
return 0;
}