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',而这些区域的内容是不确定的。
【函数示例】取得字符串 的长度。
纯文本复制
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/";
- char str2[100] = "http://see.xidian.edu.cn/cpp/u/shipin_liming/";
- char str3[5] = "12345";
- printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1));
- printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2));
- printf("strlen(str3)=%d, sizeof(str3)=%d\n", strlen(str3), sizeof(str3));
- return 0;
- }
运行结果:
strlen(str1)=38, sizeof(str1)=4
strlen(str1)=45, sizeof(str1)=100
strlen(str1)=53, sizeof(str1)=5
上面的运行结果,strlen(str1)=53显然不对,53是没有意义的。