C语言文件操作

159 阅读3分钟

操作文件之前必须先打开文件,打开文件就是让程序和文件建立连接的过程。

函数声明:

FILE *fopen(const char *filename, const char *mode):以mode的形式打开filename指向的文件。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream):向stream指向的文件写入ptr指向的数据,size是一个元素几个字节,nmemb是几个元素(一个元素的大小是size)。

int fclose(FILE *stream):关闭stream指向的文件。

实例:

int a = 10000;
FILE* pf = fopen("test.txt", "wb");
fwrite(&a, 4, 1, pf);//写入a,4个字节,一个数据,写入到pf指向的文件
fclose(pf);
pf = NULL;

文件名包括三部分:文件路径+文件名主干+文件后缀,例如:c:\code\test.txt。绝对路径:E:\C++\likou_c\WenJian\WenJian\test.txt.使用两个斜杠,一个斜杠是转义字符。没有文件会创建文件,“wb”:w是写入,b是二进制:以二进制的形式写入。后面如果不使用文件了,要关闭文件。二进制文件用记事本打开是乱码,可以使用vs打开。源文件->添加现有项->右击选择打开方式->二进制编译器

读写操作:

FILE* pfw = fopen("test1.txt", "w");
if (pfw == NULL)
{
        printf("%s\n", strerror(errno));
}
else
{
        fputc('a', pfw);//写入一个字符
        fputc('b', pfw);
        fputc('c', pfw);
        fclose(pfw);
        pfw = NULL;
}
FILE* pfr = fopen("test1.txt", "r");
if (pfr == NULL)
{
        printf("%s\n", strerror(errno));
}
else{
        printf("%c ", fgetc(pfr));//读出一个字符
        printf("%c ", fgetc(pfr));
        printf("%c ", fgetc(pfr));
        fclose(pfr);
        pfr = NULL;
}

会自动创建text1.txt文件,并写入abc。

image.png

image.png

实例中如果pfr等于空,printf("%s\n", strerror(errno))。这一句是在打开失败或者没有文件时打印错误信息,具体是什么错误没有打开文件,比如在没有text1.txt文件时,以读的方式打开文件就是报错。

image.png

输入输出流:

键盘:标准输入设备 - stdin

屏幕:标准输出设备 - stdout

这两个是一个程序默认打开的两个流设备

char in = fgetc(stdin);
fputc(in, stdout);

使用fgetc操作键盘的输入流,可以直接使用键盘输入(一个字符),使用fputc操作屏幕的输出流,可以直接在屏幕上输出。

image.png

fgets:读取一行文本

char* fgets(char* string, int n, FILE* stream);string:存储位置,n:读取长度,stream:读取的文件流

char buf[1024] = { 0 };
fgets(buf, 1024, pf);
puts(buf);//输出buf

fputs:输入一行文本

fputs("hello\n",pf);输出hello到pf指向的文件流。

键盘输入一行屏幕输出一行:

char buf[1024] = { 0 };
fgets(buf, 1024, stdin);
fputs(buf, stdout);

image.png

或者

gets(buf);
puts(buf);

image.png

  1. scanf/printf: 是针对标准输入流/标准输出流的格式化输入/输出语句
  2. fscanf/fprintf: 是针对所有输入流/所有输出流的格式化输入/输出语句
  3. sscanf/sprintf: sscanf是从字符串中读取格式化的数据;sprintf是把格式化数据输出成(存储到)字符串
//fprintf:输入有格式的文本
struct S s = { 100,3.14,"bit" };
fprintf(pf, "%d %f %s", s.n, s.f, s.arr);
//fscanf:读取有格式的文本
fscanf(pf, "%d %f %s", &(s.n), (s.f), s.arr)
struct S s = { 100, 3.14f, "abcdef" };
char buf[1024] = { 0 };
sprintf(buf, "%d %f %s", s.n, s.f, s.arr);
printf("%s\n", buf);
struct S tmp = { 0 };
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.f), &(tmp.arr));
printf("%d %f %s\n", tmp.n, tmp.f, tmp.arr);

image.png