在C中提供了对设备上文件调用的底层接口
文件写入
C中提供的打开文件的函数FILE *fopen( const char * filename, const char * mode )
其中filename是文件名,mode是对文件的操作,下表为常见的mode值
对于文件的写入,常用的有四种方式
int fputc( int c, FILE *fp );
可以存入单个字符,如果写入成功,会返回写入字符的ASCII码值,如果发生错误,则会返回 EOF。
int fputs( const char *s, FILE *fp );
是写入一个以null结尾的字符串,会返回一个非负值,如果发生错误,则会返回 EOF。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);
第一个传入的是要写入的字符串的指针,第二个是要写入的数据的大小,第三个是写入的输入数据个数,第四个是目标文件指针,返回实际写入的数据块数目
int fprintf(FILE *fp,const char *format, ...) ;
将一个字符串写入到文件中,其用法和printf类似。
文件读出
同样,读出文件里的字符也有常用的四种方式。
int fgetc( FILE * fp );
读入一个字符,返回读取的ASCII码值,如果发生错误则返回EOF
char *fgets( char *buf, int n, FILE *fp );
从文件中读取n-1个字符存到部分里,并在最后增加一个null作为终止符。在读取字符的过程中,如果遇到换行符或者文件结束的标识,则会返回之前读到的字符串,包括换行符。
size_t fread ( void *buf, size_t size, size_t count, FILE *fp) ;
第一个是存字符的buf,第二个是读取的长度,第三个是要读取的数据个数,第四个是文件指正,返回实际读到的数据个数
int fscanf(FILE*stream,const char*format,[argument...]);
用法和scanf类似,如果失败,返回EOF。需要注意的是fscanf在遇到第一个空格或者换行符时停止读取,返回的时候不包括换行符或者空格
FILE* outfile = NULL;
outfile = fopen(FILE_NAME_1, "w+");
int i = 48;
int r1 = fputc(i, outfile);
if (r1 == EOF) {
std::cout << "error: write file error" << std::endl;
}
int r2 = fputc(10, outfile); //写入换行符
std::string s1 = "input string with fputs\n";
int r3 = fputs(s1.c_str(), outfile);
if (r3 == EOF) {
std::cout << "error: write file error" << std::endl;
}
std::string s2 = "input string with fwrite\n";
fwrite(s2.c_str(), s2.length(), 1, outfile);
fprintf(outfile, "input string with fprintf\0");
fclose(outfile);
FILE* infile = NULL;
char buf[255];
infile = fopen(FILE_NAME_1, "r");
fscanf(infile, "%s", buf);
printf("1: %s\n", buf);
fgets(buf, 255, (FILE*)infile);
printf("2: %s\n", buf);
fgets(buf, 255, (FILE*)infile);
printf("3: %s\n", buf);
int r = fgetc(infile);
printf("4: %d\n", r);
fscanf(infile, "%s", buf);
printf("5: %s\n", buf);
fclose(infile);
文件里的内容为:
0
input string with fputs
input string with fwrite
input string with fprintf
输出结果为
1: 0
2:
3: input string with fputs
4: 105
5: nput string with fwrite
input string with fprintf烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫?&烫烫烫烫痱&X'烫烫烫烫烫烫
第一个0由fscanf得到,fscanf不返回特殊符号,所以第二次读取的时候先读取到第一行的换行符,结束第二次读取并打印出两个换行符(其中另一个是printf里的)。第三次读才读到文件的第二行。fgets能够读取并返回换行符,所以又打印两次。fgetc得到“i”的ASCII码,并打印出105。最后用fread读取剩余的文本,出现乱码。因为fread会读到文件结束,由于文件最后是用fprintf写入的,fread无法读取其中的手动输入的“\0”,所以最后输出buf的时候会将后面空的显示出来,造成乱码。而如果采用fgets或者fscanf来读取的话,则不会出现乱码。
这也说明,我们平时在使用这些文件处理函数的时候,最好是一一对应使用,交错使用可能会产生一些问题。
注意:需添加#define _CRT_SECURE_NO_WARNINGS
,否则会报错
C++中,对于文件采用的是文件流的形式
分别是ofstream和ifstream,其使用方式和iostream中的cin和cout相似
std::ofstream outfile;
outfile.open(FILE_NAME_2, std::ios::out | std::ios::trunc);
outfile << "input string with <<\nthis is the second line" << std::endl;
outfile.close();
char data[255];
std::ifstream infile;
infile.open(FILE_NAME_2, std::ios::out | std::ios::in);
int i = 5;
while (i--)
{
infile >> data;
std::cout << data << std::endl;
}
文件内容为:
input string with <<
this is the second line
输出结果为:
input
string
with
<<
this
ifstream的>>
读取到空格或者换行符的时候,就会停止读取。