一、写文件
#include
#include
#include
#include
int main()
{
printf("File :%s\n", __FILE__);
printf("Date :%s\n", __DATE__);
printf("Time :%s\n", __TIME__);
printf("Line :%d\n", __LINE__);
//printf("ANSI :%d\n", __STDC__);
char msg[1000];
FILE *stream;
int i = 0;
if ((stream = fopen("D:/CppWorkspace/Class_2/Class4/abc.txt", "w")) == NULL)
{
perror("fail to write");
exit(1);
}
scanf("%s", msg); //控制台键入内容到文件中
while (msg[i])
{
fputc(msg[i], stream);
i++;
}
return 0;
}
运行结果:
二、读文件
1、打开文件 fopen("需要打开的路径")
2、然后使用 fgets 函数读取行
#include
#include
#include
#include
#define MAX_LINE 1024
int main()
{
char buf[MAX_LINE]; /*缓冲区*/
FILE *fp; /*文件指针*/
int len; /*行字符个数*/
if ((fp = fopen("D:/CppWorkspace/Class_2/Class4/abc.txt", "r")) == NULL)
{
perror("fail to read");
exit(1);
}
while (fgets(buf, MAX_LINE, fp) != NULL)
{
len = strlen(buf);
buf[len - 1] = '\0'; /*去掉换行符*/
printf("%s %d \n", buf, len - 1);
}
return 0;
}
运行结果:
三、按‘行’读取代码:
1、 使用fgets函数,从文件中读取多行:
#include "stdlib.h"
#include "stdio.h"
int main(int argc, char *argv[])
{
FILE *in= fopen("D:/in.java", "r");
char buf[1024];
while (fgets(buf, sizeof(buf), in) != NULL)
{
printf("%s", buf);
}
fclose(text);
return 0;
}
2、使用fputs函数,从一个文件逐行读取 ,写入到另一个文件:
#include "stdlib.h"
#include "stdio.h"
int main(int argc, char *argv[])
{
FILE *in= fopen("D:/In.java", "r");
FILE *out = fopen("D:/Out.java", "w");
char buf[1024];
while (fgets(buf, sizeof(buf), in) != NULL)
{
fputs(buf, out);
}
fclose(in);
fclose(out);
return 0;
}
四、fopen & fclose
rt | 只读打开一个文本文件,只允许读数据 |
wt | 只写打开或建立一个文本文件,只允许写数据 |
at | 追加打开一个文本文件,并在文件末尾写数据 |
rb | 只读打开一个二进制文件,只允许读数据 |
wb | 只写打开或建立一个二进制文件,只允许写数据 |
ab | 追加打开一个二进制文件,并在文件末尾写数据 |
rt+ | 读写打开一个文本文件,允许读和写 |
wt+ | 读写打开或建立一个文本文件,允许读写 |
at+ | 读写打开一个文本文件,允许读,或在文件末追加数据 |
rb+ | 读写打开一个二进制文件,允许读和写 |
wb+ | 读写打开或建立一个二进制文件,允许读和写 |
ab+ | 读写打开一个二进制文件,允许读,或在文件末追加数据 |
(1)文件使用方式由r、w、a、t、b 和 + 六个字符拼成,各字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件,可省略不写
b(banary):二进制文件
+:读和写
(2)凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。
(3)用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
(4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。
(5)在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
FILE*fWrite, *fRead;
//第一种打开文件的方法
if (!(fWrite = fopen("test.txt", "w")))
{
printf("file was not opened! ");
exit(1);
}
//第二种打开文件的方法
fRead = fopen("test.txt", "r");
if (fRead == NULL)
{
printf("file was not opened! ");
exit(1);
}
(6)把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。
(7)标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。
文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。
fclose函数调用的一般形式是:
fclose(文件指针);
例如:
fclose(fp);
正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。
C语言文件指针及文件打开和关闭
五、读和写函数
1、字符读写函数 fgetc / fputc
int fputc(
int c, //字符
FILE *stream //文件指针
);
int fgetc(
FILE *stream //文件指针
);
示例代码:
#include
void function()
{
//打开文件
FILE *fWrite, *fRead;
if (!(fWrite = fopen("./test.txt", "w")))
{
printf("file was not opened! ");
exit(1);
}
fRead = fopen("./test.txt", "r");
if (fRead == NULL)
{
printf("file was not opened! ");
exit(1);
}
/*************** fputc *****************/
//写入单个字符
fputc('a', fWrite); //写入字符
//循环写入字符
char arr[128] = "你好,世界!";
char *p = arr;
while ((*p != '\0') && fputc(*(p++), fWrite) != EOF);
fclose(fWrite); //一定要记得关闭文件
/*************** fgetc *****************/
//单个读取字符
char ch = fgetc(fRead);
putchar(ch);
rewind(fRead); //将文件内部指针移回文件开头
while (!feof(fRead)) //feof函数
{
printf("%c", fgetc(fRead));
}
fclose(fRead);
}
int main() {
function();
return 0;
}
运行结果:
2、字符串读写函数 fgets / fputs
int fputs(
const char *str, //字符数组
FILE *stream //文件指针
);
char *fgets(
char *str, //字符数组
int numChars, //最多读取的字符个数
FILE *stream //文件指针
);
示例代码:
//写入
fputs( "Hello world\n", fWrite);
//读取
char arr[128];
while (fgets(arr, 127, fRead) != NULL) //arr至少留一个位置给'\0'
{
puts(arr);
}
3、格式化读写文件 fprintf / fscanf
int fprintf(
FILE *stream, //文件指针
const char *format [,//字符数组
argument ]...
);
int fscanf(
FILE *stream, //文件指针
const char *format [,//字符数组
argument ]...
);
fprintf() 失败时返回‘-1’
参考资料: C语言中fscanf函数
其中fscanf函数的返回值为:参数列表中被成功赋值的参数个数;失败时,返回‘-1’
示例:
示例代码:
有问题的代码?
#include
void function()
{
//打开文件
FILE *fWrite, *fRead;
if ((fWrite = fopen("./thisfile.txt", "w")) == NULL) {
printf("file can not open!");
exit(1);
}
//写入文件
fprintf(fWrite, "我的学号是%d\n", 1001);
char arr[128] = "你好,世界!";
char arr1[128] = {0};
fprintf(fWrite, arr);
fclose(fWrite);
//读取文件
if ((fRead = fopen("./thisfile.txt", "r")) == NULL) {
printf("file can not open!");
exit(1);
}
while (!feof(fRead))
{
fscanf(fRead, arr1);
puts(arr1);
}
fclose(fRead);
}
int main() {
function();
return 0;
}
4、二进制读写文件 fread / fwrite
size_t fwrite(
const void *buffer, //指向要写入的数据的指针
size_t size, //要写入项目的大小,以字节为单位
size_t count, //要写入的最大项目数
FILE *stream //指向FILE结构的指针
);
size_t fread(
void *buffer, //数据的存储位置
size_t size, //项目大小(以字节为单位)
size_t count, //读取的最大项目数
FILE *stream //指向FILE结构的指针
);
https://zhuanlan.zhihu.com/p/98575713