在 C 语言的 I/O 编程中,stdio.h
是标准输入输出库,提供了许多用于处理输入和输出的函数。以下是一些常用的 stdio
基本命令及其用法:
1. 文件操作
打开文件
FILE *fopen(const char *filename, const char *mode);
-
功能:打开文件。
-
参数:
-
filename
:文件名。 -
mode
:打开模式(如"r"
只读,"w"
只写,"a"
追加等)。
-
-
返回值:成功时返回文件指针,失败时返回
NULL
。
示例:
FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Failed to open file"); }
关闭文件
int fclose(FILE *stream);
-
功能:关闭文件。
-
参数:
stream
是文件指针。 -
返回值:成功时返回
0
,失败时返回EOF
。
示例:
fclose(file);
2. 字符输入输出
读取字符
int fgetc(FILE *stream);
-
功能:从文件或流中读取一个字符。
-
参数:
stream
是文件指针。 -
返回值:返回读取的字符(转换为
int
),失败或到达文件末尾时返回EOF
。
示例:
int ch = fgetc(file); if (ch != EOF) { putchar(ch); }
写入字符
int fputc(int ch, FILE *stream);
-
功能:向文件或流中写入一个字符。
-
参数:
-
ch
:要写入的字符。 -
stream
:文件指针。
-
-
返回值:成功时返回写入的字符,失败时返回
EOF
。
示例:
fputc('A', file);
3. 字符串输入输出
读取字符串
char *fgets(char *str, int n, FILE *stream);
-
功能:从文件或流中读取一行字符串。
-
参数:
-
str
:存储读取字符串的缓冲区。 -
n
:最大读取字符数(包括空字符\0
)。 -
stream
:文件指针。
-
-
返回值:成功时返回
str
,失败或到达文件末尾时返回NULL
。
示例:
char buffer[100]; if (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); }
写入字符串
int fputs(const char *str, FILE *stream);
-
功能:向文件或流中写入字符串。
-
参数:
-
str
:要写入的字符串。 -
stream
:文件指针。
-
-
返回值:成功时返回非负值,失败时返回
EOF
。
示例:
fputs("Hello, World!", file);
4. 格式化输入输出
格式化输出
int fprintf(FILE *stream, const char *format, ...);
-
功能:将格式化数据写入文件或流。
-
参数:
-
stream
:文件指针。 -
format
:格式化字符串。 -
...
:可变参数列表。
-
-
返回值:成功时返回写入的字符数,失败时返回负数。
示例:
fprintf(file, "Number: %d, String: %s\n", 42, "Hello");
格式化输入
int fscanf(FILE *stream, const char *format, ...);
-
功能:从文件或流中读取格式化数据。
-
参数:
-
stream
:文件指针。 -
format
:格式化字符串。 -
...
:可变参数列表(需传递变量地址)。
-
-
返回值:成功时返回匹配的输入项数,失败或到达文件末尾时返回
EOF
。
示例:
int num; char str[100]; fscanf(file, "%d %s", &num, str);
5. 二进制输入输出
读取二进制数据
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
-
功能:从文件或流中读取二进制数据。
-
参数:
-
ptr
:存储数据的缓冲区。 -
size
:每个数据项的大小。 -
count
:要读取的数据项数量。 -
stream
:文件指针。
-
-
返回值:成功时返回读取的数据项数量。
示例:
int data[10]; size_t result = fread(data, sizeof(int), 10, file);
写入二进制数据
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
-
功能:向文件或流中写入二进制数据。
-
参数:
-
ptr
:要写入的数据。 -
size
:每个数据项的大小。 -
count
:要写入的数据项数量。 -
stream
:文件指针。
-
-
返回值:成功时返回写入的数据项数量。
示例:
int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; fwrite(data, sizeof(int), 10, file);
6. 文件定位
获取当前位置
long ftell(FILE *stream);
-
功能:返回文件的当前读写位置。
-
参数:
stream
是文件指针。 -
返回值:成功时返回当前位置,失败时返回
-1L
。
示例:
long pos = ftell(file);
移动文件指针
int fseek(FILE *stream, long offset, int origin);
-
功能:移动文件指针到指定位置。
-
参数:
-
stream
:文件指针。 -
offset
:偏移量。 -
origin
:起始位置(SEEK_SET
文件开头,SEEK_CUR
当前位置,SEEK_END
文件末尾)。
-
-
返回值:成功时返回
0
,失败时返回非零值。
示例:
fseek(file, 0, SEEK_SET); // 移动到文件开头
练习:
1.编写程序获得一个文件中出现哪些字符?及每种字符出现的次数?及哪种字符出现的次数最多?
#include <stdio.h>
#include "public.h"
int count_character_quantity(const char *pfilename)
{
int a[256] = {0};
char ch = 0;
int i = 0;
int max = 0;
FILE *fp = NULL;
fp = fopen(pfilename, "r");
if (NULL == fp)
{
return -1;
}
while (1)
{
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
a[ch]++;
}
a[max] = a[0];
for (i = 0; i < 256; i++)
{
if (a[i] != 0)
{
printf("'%c'字符数量:%d\n", i, a[i]);
}
if (a[max] < a[i])
{
max = i;
}
}
printf("'%c'字符数量最多,为:%d\n", max, a[max]);
fclose(fp);
return 0;
}
int main(int argc, const char **argv)
{
if (argc != 2)
{
printf("usage:./a.out srcfilename\n");
return -1;
}
count_character_quantity(argv[1]);
return 0;
}
编写代码实现:查询文件的大小;
#include <stdio.h>
#include "public.h"
long get_memory_size(const char *filenamen)
{
FILE *fp = NULL;
long ret = 0;
fp = fopen(filenamen, "r");
if (NULL == fp)
{
ERR_MSG("fopen failed!");
return -1;
}
fseek(fp, 0, SEEK_END);
ret = ftell(fp);
fclose(fp);
return ret;
}
int main(int argc, const char **argv)
{
long ret = 0;
if (argc != 2)
{
printf("usage:./a.out filename\n");
printf("command: this command is used to get memory size of filenamen\n");
return -1;
}
ret = get_memory_size(argv[1]);
printf("内存大小:%ldB\n", ret);
return 0;
}