首页 > 代码库 > 9.4 文件IO基本操作
9.4 文件IO基本操作
fopen后必须判断 FILE *p 是否返回NULL
fopen打开文件后,一定要fclose
feof 判断文件是否到达最后
对一个文件进行简单的加密解密操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define S_KEY 10
void code(const char * src , const char * dest)
{
FILE * fp1 = fopen( src , "r" );
FILE * fp2 = fopen( dest , "w" );
if( !fp1 || !fp2)
{
printf("打开文件失败\n");
exit( -1 );
}
char buf[1024];
int len = 0 , i = 0;
while(!feof(fp1))
{
fgets( buf , sizeof(buf) , fp1);
len = strlen(buf);
for( i = 0 ; i < len ; ++i)
buf[i] += S_KEY;
fputs( buf , fp2);
}
}
void decode(const char * src , const char * dest)
{
FILE * fp1 = fopen( src , "r" );
FILE * fp2 = fopen( dest , "w" );
if( !fp1 || !fp2)
{
printf("打开文件失败\n");
exit( -1 );
}
char buf[1024];
int len = 0 , i = 0;
while(!feof(fp1))
{
fgets( buf , sizeof(buf) , fp1);
len = strlen(buf);
for( i = 0 ; i < len ; ++i)
buf[i] -= S_KEY;
fputs( buf , fp2);
}
}
int main(int argc , char * argv[])
{
if( argc < 4)
{
printf("参数一 是加密(1)或解密(2)\n");
printf("参数二 是源文件\n参数三 是目标文件\n");
exit(-1);
}
if( atoi(argv[1]) == 1)
code(argv[2],argv[3]);
else if(atoi(argv[1]) == 2)
decode(argv[2],argv[3]);
return 0;
}
其他文件读写函数:
fprintf 是向一个文件写入东西 , 感觉类似 php 的 file_put_contents();?????
fscanf 可以从一个文件读入东西。不过遇到空格就会自动终止。
#include <stdio.h>
int main()
{
FILE *fp = fopen( "test.txt" , "r" ); //这个文件是有hello world 因为有空格 只能读出来hello
char buf[100] ;
fscanf( fp , "%s" , buf);
printf("%s\n" , buf );
fclose( fp);
return 0;
}
fopen的 b 模式
FILE *p = fopen( "a.txt" , "wb");
b的意思是按照二进制的方式写文件
windows这个选项才有作用,linux可写可不写
例:
在windows下 没有b模式写入文件一个 \n 的时候 会自动写入 \r\n
如果有b的话,完全按照二进制方式写 只会写入 \n
linux和windows通过网络传输文件(借助myudp)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "myudp.h"
#pragma comment (lib,"myudp.lib")
int main(int argc , char *argv[])
{
if(argc < 3)
{
printf("[./app] [FILE_NAME] [SEND:1] [IP]\n");
printf("[./app] [FILE_NAME] [RECV:2]\n");
return -1;
}
if( atoi(argv[2]) == 1)
{
FILE *fp = fopen( argv[1] , "r");
if( !fp )
{
printf("打开文件失败\n");
return -1;
}
if(argv[3] == NULL)
{
printf("请输入你需要发送的IP\n");
return -1;
}
char buf[1024] , ch;
while( !feof( fp ) )
{
memset(buf , 0 , sizeof(buf));
fgets( buf , sizeof(buf) , fp );
send_socket( argv[3], 8080, buf, sizeof(buf));
}
ch = EOF;
send_socket( argv[3], 8080, &ch, sizeof(ch));
fclose(fp);
}
else if( atoi(argv[2]) == 2) //接收的
{
FILE *fp = fopen( argv[1] , "w");
if( !fp )
{
printf("打开文件失败\n");
return -1;
}
char buf[1024];
char IP[1024];
bind_socket( 8080 );
while( 1 )
{
memset( buf , 0 , sizeof(buf));
memset( IP , 0 , sizeof(IP));
recv_socket(buf, sizeof(buf), IP);
if( buf[0] == EOF)
break;
fputs( buf , fp);
}
fclose(fp);
}
return 0;
}
就可以把windows里的a.txt 发送到linux里
通过fgets获取文件的行数:
int file_count(FILE *fp)
{
char buf[1024] , len = 0;
while( fgets( buf , sizeof(buf) , fp) != NULL )
{
len++;
}
return len;
}
此方法得到的行数是正确的。
int file_count(FILE *fp)
{
char buf[1024] , len = 0;
while( !feof(fp))
{
fgets( buf , sizeof(buf) , fp);
len++;
}
return len;
}
上面这种方法得到的行数比实际大 1,不正确
读取一个文件的所有数字,进行排序,并且写入另外一个文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int file_count(FILE *fp)
{
char buf[1024] , len = 0;
while( fgets( buf , sizeof(buf) , fp) != NULL )
{
len++;
}
rewind(fp);
return len;
}
void show_array(int *p , int len)
{
int i;
for( i = 0 ; i < len ; i++)
printf("%d\n",p[i]);
}
//选择排序
void sort_array(int *p , int len)
{
int i, j , min , tmp;
for(i = 0 ; i < len ; ++i)
{
min = i;
for(j = i+1 ; j < len ; ++j)
if(p[min] > p[j])
min = j;
if(min != i)
{
tmp = p[i];
p[i] = p[min];
p[min] = tmp;
}
}
}
int main()
{
FILE *fp = fopen("t.txt" , "r");
if(!fp)
{
printf("打开文件失败\n");
return -1;
}
int len = file_count(fp) , i = 0;
int *p = (int *)malloc(sizeof(int) * len);
memset(p , 0 , sizeof(int) * len);
char buf[1024] = {0};
for( i = 0 ; i < len ; i++)
{
fgets( buf , sizeof(buf) , fp);
p[i] = atoi(buf);
}
//show_array( p , len);
sort_array( p , len);
//show_array( p , len);
FILE *fp2 = fopen("sort.txt" , "w");
for( i = 0 ; i < len ; i++)
fprintf(fp2 , "%d\n" , p[i]);
free(p);
fclose(fp);
fclose(fp2);
return 0;
}
来自为知笔记(Wiz)
9.4 文件IO基本操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。