栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

0225 系统编程(C文件使用)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

0225 系统编程(C文件使用)

目录

一、知识点

二、代码


一、知识点

1.系统命令、API、系统调用层次结构

2.文件表在内存,与进程同级别;

文件描述符算系统资源,若不关闭文件,文件表和描述符都会耗尽;

3.系统调用:

1)creat()创建的文件只能写不能读

2)open()有则打开无则creat();只读打开后可以追加可写O_APPEND;

3) read()返回读取字节数,大小  0<= return <= lengths ;

  【read和write都可能部分读,即至少读一个】

  【1.常规文件不堵塞; 2.终端(换行结束)和 网络可能堵塞;3设置文件不堵塞后,要轮询】

close(文件描述符)

4.C库函数

    1.Windows下添加getchar()防止过屏被闪掉
    2.fseek等价于lseek调整文件读取指针位置

5.如果一个函数调用无法从其返回值上判断是否发生了错误时,那么将只能通过 errno 的值来判断是否出错以及出错的原因。对于这种情况,必须在调用函数之前先将 errno 的值手动清零

int main(void)
{
    
    errno=0;
    FILE *fp = fopen("test.txt","r");
    if(errno!=0)
    {
        printf("errno值: %dn",errno);
        printf("错误信息: %sn",strerror(errno));
    }
}

二、代码

1.系统调用复制文件

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFFER_SIZE 1024


int main(int argc, char **argv)
{
    int from_fd, to_fd;
	int bytes_read, bytes_write;
	char buffer[BUFFER_SIZE];
	
	// 部分写
	char *ptr = NULL;

    int ret;

    if (3 != argc)
	{
		printf("need from file and to filen!n");
		exit(0);
	}
 
    from_fd = open(argv[1], O_RDONLY);
	if (-1 == from_fd)
	{
		perror("open from file error!n");
		exit(-1);
	}
	
	//  因为create所以有第三个参数mode 
	if ((to_fd = open(argv[2], O_WRonLY | O_CREAT, S_IWUSR | S_IRGRP | S_IRUSR)) == -1)
	{
		perror("open to file error!n");
		close(from_fd);
		exit(-1);
	}

    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE))
	{
        if (-1 == bytes_read)
		{
			perror("read from file! file copy fail!n");
			break;
		}
		else if (bytes_read > 0)
		{
			ptr = buffer;

            while (bytes_write = write(to_fd, buffer, bytes_read))
			{
                if (-1 == bytes_write)
				{
					perror("write error! file copy fail!n");

					// 多重最好goto
					break;
				}        
                else if (bytes_write == bytes_read)
				{
					break;
				}
				else
				{
					bytes_read = bytes_read - bytes_write;
					ptr = ptr + bytes_write;
				}
			}

			if (-1 == bytes_write)
			{
				break;
			}
		}

		
	}

	close(from_fd);
	close(to_fd);

	return 0;
}

2.库函数文件两个数相加

#include 
#include 
#include 

int main()
{
    FILE *fp1;
	FILE *fp2;
	FILE *fp3;

	if ((fp1 = fopen("c1.txt", "r")) == NULL)
	{
		printf("Cannot open file1!n");
		exit(1);
	}

	if ((fp2 = fopen("c2.txt", "r")) == NULL)
	{
		printf("Cannot open file2!n");
		exit(1);
	}

    if ((fp3 = fopen("c3.txt", "w")) == NULL)
	{
		printf("Cannot open file3!n");
		exit(1);
	}

    char ch1;
	char ch2;
	char ch3_1;
	char ch3_2;

	ch1 = fgetc(fp1);
	ch2 = fgetc(fp2);

    int num1;
	int num2;
	int num3;

	while (ch1 != EOF && ch2 != EOF)
	{
        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9')
		{
            num1 = 0;
			num2 = 0;
			fputc(ch1, fp3);
		}
		else
		{
            num1 = num1 * 10 + (ch1 - '0');
            num2 = num2 * 10 + (ch2 - '0');

            if (num1 > 9 || num2 > 9)
			{
				num3 = num1 + num2;
				ch3_1 = ((num3 % 10) + '0');
				ch3_2 = ((num3 / 10) + '0');

				fputc(ch3_1, fp3);
				fputc(ch3_2, fp3);
			}
		}

		ch1 = fgetc(fp1);
		ch2 = fgetc(fp2);
	}

    fclose(fp1);
	fclose(fp2);
	fclose(fp3);

	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号