C语言和指针:IO详情
Vivian 2018-05-15 来源 : 阅读 900 评论 0

摘要:本文介绍了C语言和指针的IO详情,通过具体的解释说明,让我们从中学到IO详情的关键所在,希望对大家C语言学习有所帮助。

本文介绍了C语言和指针的IO详情,通过具体的解释说明,让我们从中学到IO详情的关键所在,希望对大家C语言学习有所帮助。

1、流

io操作就是简单的从程序移进或移出字节的事情,这种字节流便称为流

2、流的两种类型,文本流和二进制流

1)、文本流:文本流是指在流中流动的数据是以字符形式出现
2)、二进制流:二进制流是指流动的是二进制数字序列,若流只有字符,则用一个字节的二进制ASCII码表示,若是数字,则用对应的二进制数表示。在流入流出时,对\n符号不进行变换
例如5678这个数,在文本流中用其ASCII码表示为:
5678的存储形式为:ASCII码: 00110101 00110110 00110111 00111000 (四个字节)
5678的存储形式为:二进制: 00010110 00101110 (两个字节)
共占4字节。而在二进制流中则表示为:00000111 11010001 用十六进制就是07D1。只占两字节,二进制流比文本流节省空间,且不用进行对\n的转换,可以大大加快流的速度,提高效率。因而,对于含有大量数字信息的数字流,可以采用二进制流的方式;对于含有大量字符信息的流,则采用文本流的方式。
1)文本流的特性,文本行的最大长度,标准最少24字符,结束方式,在dos系统,以一个回车符和一个换行符结尾,unix只适用一个换行符结尾
计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
C中文本或二进制读写都是缓冲区与文件中二进制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本读与二进制读的结果一样.

3、io流的3种基本形式处理

1、单个字符
int fgetc(FILE *stream)
int fputc(int character, FILE *stream);
int getc(FILE *stream)
int putc(int character, FILE *stream);
int getchar(void)
int putchar(int character);
2、文本行
未格式化行的i/o
char *fgets(char *buffer, int buffer_size, FILE *stream);
char *gets(char *buffer);
int fputs(char const *buffer, FILE *stream);
int puts(char const *buffer);
格式化i/o
int fscanf(FILE *stream, char const *format, ...);
int scanf(char const *format, ...);

int sscanf(char const *string, char const *format, ...);

4、部分Demo

   

#include <stdio.h>
#include <stdlib.h>
 
/**
如果没有找到打开的文件
**/
int main()
{
    FILE *input;
    input = fopen("data20", "r");
    if (input == NULL)
    {
        perror("data3");
        exit(EXIT_FAILURE);
    }
    return 0;
}
/**
1111deMacBook-Pro:Music a1111$ gcc -g fopen.c -o fopen
1111deMacBook-Pro:Music a1111$ ./fopen
data3: No such file or directory
**/</stdlib.h></stdio.h>

    

#include <stdio.h>
#include <ctype.h>
 
//转换从标准输入读入的数字
int read_int()
{
    int value;
    int ch;
    while ((ch = getchar()) != EOF && isdigit(ch))
    {
        value *= 10;
        value += ch - '0';
    }
    return value;
}
int main()
{
    int value = read_int();
    printf("value is %d\n", value);
    return 0;
}
 
/**
1111deMacBook-Pro:Music a1111$ gcc -g getc.c -o getc
1111deMacBook-Pro:Music a1111$ ./getc
1233
value is 1233
1111deMacBook-Pro:Music a1111$
**/
~ </ctype.h></stdio.h>


#include <stdio.h>
#define MAX_LENGTH 1024
 
//复制文件
void copylines(FILE *input, FILE *output)
{
    char buffer[MAX_LENGTH];
    while (fgets(buffer, MAX_LENGTH, input) != NULL)
        fputs(buffer, output);
}
int main()
{
    FILE *input = fopen("data2", "r");
    if (input != NULL)
    {
        FILE *output = fopen("data3", "w");
        if (output != NULL)
        {
            copylines(input, output);
            fclose(output);
        }
        else
             puts("data3 is NULL");
        fclose(input);
    }
    else
        puts("data2 is NULL");
    return 0;
}
</stdio.h>


#include <stdio.h>
 
int main()
{
    char str[512] = {0};
    sscanf("123456", "%4s", str);
    printf("str is %s\n", str);
    //读到大写字母为止
    sscanf("123aaadf4aD45dbcdBDD", " %[^A-Z]", str);
    printf("str is %s\n", str);
    return 0;
}
/**
1111deMacBook-Pro:Music a1111$ vim sscanf.c
1111deMacBook-Pro:Music a1111$ gcc -g sscanf.c -o sscanf
1111deMacBook-Pro:Music a1111$ ./sscanf
str is 1234
str is 123aaadf4a
**/
</stdio.h>


#include <stdio.h>
#include <stdlib.h>
 
//格式化数据输入到文本
FILE* stream;
int main(void)
{
    int i = 15;
    double fp = 15.5;
    char s[] = "hello word";
    char c = '\n';
    stream = fopen("fprintf.txt", "w");
    fprintf(stream, "%s%c", s, c);
    fprintf(stream, "%d\n", i);
    fprintf(stream, "%f\n", fp);
    fclose(stream);
    return 0;
}
/**
hello word
15
15.500000
**/</stdlib.h></stdio.h>

    

#include <stdio.h>
 
//格式化输入数据到文本
int main()
{
    FILE* fp;
    int i = 117;
    char* s = "chenyu";
    fp = fopen("text.dat", "w");
    fputs("total", fp);
    fputs(":", fp);
    fprintf(fp, "%d\n", i);
    fprintf(fp, "%s", s);
    fclose(fp);
    return 0;
}
/**
total:117
chenyu
**/</stdio.h>

    

#include <stdio.h>
 
//ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数
int main(void)
{
   FILE *stream;
   stream = fopen("MYFILE.TXT", "w+");
   fprintf(stream, "This is a test");
   printf("The file pointer is at byte %ld\n", ftell(stream));
   fclose(stream);
   return 0;
}
/**
1111deMacBook-Pro:Music a1111$ vim ftell.c
1111deMacBook-Pro:Music a1111$ gcc -g ftell.c -o ftell
1111deMacBook-Pro:Music a1111$ ./ftell
The file pointer is at byte 14
**/</stdio.h>
   
int fprintf(FILE *stream, char const *format, ...);int printf(char const *format, ...);int sprintf(char *buffer, char const *format, ...);3、二进制数据size_t fread(void *buffer, size_t size, size_t count, FILE *stream);size_t fwrite(void *buffer, size_t, size, size_t count, FILE *sread);

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程