Linux软件编程——IO编程,stdio (DAY 2)

在 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值