C语言文件操作

fopen成功返回文件指针,失败返回null

fopen_s成功返回0,失败返回非0,并且参数加上&fp

fscanf用于拿出文件里的数据,即读取,参数相较scanf多了fp流

fscanf_s需要最后指定size,和scanf_s一样多了长度的制定(fp,format,size);

fprint用于往文件中写入内容(fp,format);

把format里面“”里的直接写在了后面

 

对于字符

向流输出:fputc(int,fp)//

用写和读写会清楚原有内容,从开始开始

用追加才是从末开始保留原有

不存在则会创建

putchar(int)错误返回eof,正确返回字符

先用两个getchar然后while(ch!=eof),fputc(ch,fp),getchar,循环。实现写入

输入函数,从文件中读取

int fgetc(fp) int getchar() 

ch = fgetc(fp);

while(ch!=eof)            //while(ch=getc(fp)!=eof)//末尾返回EOF

putchar(ch);

ch=fgetc(fp)

//while(ch!=eof) chrl+z

ch=fgtc(fp)

putchar(ch)

这样来进行读取

 

fputs(“something”,fp)//没有f不需要fp

错误返回rof,否则返回非负数

 

fgets(str,sizeof(str),fp)//可以避免scanf的空格

逐个读入字符,直到遇到换行符或者读了size-1个

 

fread和fwrite用于大的数据块

fwrite(a,sizeof(a【0】),sizeof(a)/sizeof(a【0】),fp)

fread类似,第三个为读入几次,用于结构体特别有用//从流读入数组,循环

先用循环fread写入,再正常的printf

fwrite(&stu【i】,sizeof(struct student-type),1,fp)

循环

fseeek则是找位置

 

 

#include <stdio.h>

#include <stdlib.h>


int main()
{
    FILE *fin;
int a[20];
char filename[] = "E:\\sort.txt";
fin = fopen( filename, "r+");
if (fin==NULL) {
printf("read_file(): 打开文件%s失败!\n", filename);
exit(0);
}
else {
printf("read_file(): 成功打开文件%s!\n", filename);
}
int i = 0;
for (i = 0; i < 9; i++) {
fscanf(fin, "%d", &a[i]);//将文件内的写入数组
}
for (i = 0; i < 9 ; i++) {
printf("%d\t", a[i]);
}
fclose(fin);
    printf("Hello world!\n");
    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

// OJ题目.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *fin;
    char filename[] = "execute.stdin.txt";
    errno_t err;
    err = fopen_s(&fin,filename, "r+");

    if (err!=0) {            //此处用于打开,如果无_s就去掉第一个参数,判别为fin==NULL就失败
        printf("打开失败");
        exit(0);
    }
    else
        printf("成功打开%s\n", filename);
    char cool[100];
    int i = 0;
    char ch = fgetc(fin);
    while (ch != EOF) {
        putchar(ch);
        cool[i++] = ch;//读取文件中的字符并存储在数组中,用strlen来统计长度
        ch = fgetc(fin);
    }

    cool[i] = '\0';
    int a = strlen(cool);//12
    int b = a;//12
    printf("\n");//在最后加上\0,因为strlen读到这个字符处停止,手动加入强行停止
    for (; a-b-1 >= (-b); a--) {
        fseek(fin, a - b - 1, 2);//-1   -12
        ch = fgetc(fin);
        putchar(ch);

    }
    system("pause");
    return 0;
}

 

关于strlen

定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以 sizeof(str) 等于100,strlen(str) 等于11。

如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如
    char str[6] = "abcxyz";
strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的。

【函数示例】取得字符串 的长度。

纯文本复制
 
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/";
  6. char str2[100] = "http://see.xidian.edu.cn/cpp/u/shipin_liming/";
  7. char str3[5] = "12345";
  8. printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1));
  9. printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2));
  10. printf("strlen(str3)=%d, sizeof(str3)=%d\n", strlen(str3), sizeof(str3));
  11. return 0;
  12. }

运行结果:
strlen(str1)=38, sizeof(str1)=4
strlen(str1)=45, sizeof(str1)=100
strlen(str1)=53, sizeof(str1)=5

上面的运行结果,strlen(str1)=53显然不对,53是没有意义的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值