标准文件io实例,怎样用文件io从终端向文件输入

1,怎样用文件io从终端向文件输入打开1个文件,然后使用“符号
2,用Java IO写的文件import java.io.*;public class test {public static void main(String arg[]) {// 构造一个File对象, 将文件路径初始化进去File file = new File("c:\\read.txt");BufferedReader reader = null;try {reader = new BufferedReader(new FileReader(file));String tempString = null;// 一次读入一行,直到读入null为文件结束while ((tempString = reader.readLine()) != null) {System.out.println(tempString);}reader.close();} catch (IOException e) {e.printStackTrace();}}}
3,C语言标准io的文件覆盖问题文件的规则比较多 。这里是用"r+"打开的,就是"读/写"方式 , 那么在读、写转换时要在二者之间用fseek函数确定一下光标位置 。代码中读后没有确定光标位置,直接写操作是不行的 。另,txt文件是以字符形式存储的,当要用一个短串写入时不能完全覆盖原来的长串(比如原来是数字1234,而用789写入只覆盖123而成为7894);而如果反过来用长串写入,则会侵犯到原来后面的数据 。所以文件改写内容比较麻烦 。首先要清楚fscanf格式化字符串用法和fopen的r+属性 。代码分析如下:代码每循环一次a加1最初a=-1,加1后a=0fprintf("%d");把0输出到文件文件内容现在就是0循环第二次,a=1把1追加到文件中那么现在的文件内容就是01类推:文件内容就是0123456.........直到你强退出 。第二次打开fscanf会把0123456...转换为数值给你分析了一遍 , 明白其中缘由了吧 。解决方法1:在代码要退出的时候才把a的值写到文件 。解决方法2:fseek(fp,0,SEEK_SET);//加在fprintf前fprintf("%d\n");//加个\n解决方法3:在循环前fclose(fp);关闭文件在printf前重新打开文件,如下:fp=fopen("2.txt","w");//w方式 , 不要+fprintf("%d",a);fclose(fp);//写完就关闭最后建议用第一种方法 。#include <stdio.h>#define n 128int main()file *f;char s[n];f = fopen("aaa.txt", "r");while(!feof(f))fgets(s, n, f); printf("%s\n", s);}fclose(f);return 0;}【标准文件io实例,怎样用文件io从终端向文件输入】
4 , 如何用标准io和文件io写加密文件标准IO与文件IO 的不同之处 , 先来说说标准IO:标准I/O是ANSI C建立的一个标准I/O模型 , 是一个标准函数包和stdio.h头文件中的定义 , 具有一定的可移植性 。标准IO库处理很多细节 。例如缓存分配,以优化长度执行IO等 。标准的IO提供了三种类型的缓存 。?。?)全缓存:当填满标准IO缓存后才进行实际的IO操作 。(2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作 。(3)不带缓存:stderr就是了 。文件IO:文件IO称之为不带缓存的IO(unbuffered I/O) 。不带缓存指的是每个read,write都调用内核中的一个系统调用 。也就是一般所说的低级I/O——操作系统提供的基本IO服务 , 与os绑定,特定于linix或unix平台 。2不同的地方首先:两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数 , 不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构 。低级I/O一般没有采用缓冲 , 需要自己创建缓冲区 , 不过其实在linix或unix系统中 , 都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制 。其次从操作的设备上来区分,文件I/O主要针对文件操作,读写硬盘等,它操作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等 , 它操作的是字符流 。对于不同设备得特性不一样 , 必须有不同api访问才最高效 。软件开发专业网关注 , 其实最重要的还是他们各自的函数了;1.fopen与open标准I/O使用fopen函数打开一个文件:FILE* fp=fopen(const char* path,const char *mod)其中path是文件名,mod用于指定文件打开的模式的字符串 , 比如"r","w","w+","a"等等 , 可以加上字母b用以指定以二进制模式打开(对于 *nix系统 , 只有一种文件类型 , 因此没有区别),如果成功打开 , 返回一个FILE文件指针,如果失败返回NULL,这里的文件指针并不是指向实际的文 件 , 而是一个关于文件信息的数据包,其中包括文件使用的缓冲区信息 。文件IO使用open函数用于打开一个文件:int fd=open(char *name,int how);与fopen类似,name表示文件名字符串,而how指定打开的模式:O_RDONLY(只读),O_WRONLY(只写),O_RDWR (可读可写),还有其他模式请man 2 open 。成功返回一个正整数称为文件描述符,这与标准I/O显著不同,失败的话返回-1,与标准I/O返回NULL也是不同的 。2.fclose与close与打开文件相对的,标准I/O使用fclose关闭文件 , 将文件指针传入即可,如果成功关闭,返回0,否则返回EOF比如:if(fclose(fp)!=0)printf("Error in closing file");而文件IO使用close用于关闭open打开的文件 , 与fclose类似,只不过当错误发生时返回的是-1,而不是EOF,成功关闭同样是返回0 。C语言用error code来进行错误处理的传统做法 。3. 读文件 , getc,fscanf,fgets和read标 准I/O中进行文件读取可以使用getc,一个字符一个字符的读取 , 也可以使用gets(读取标准io读入的)、fgets以字符串单位进行读?。ǘ恋接?到的第一个换行字符的后面) , gets(接受一个参数,文件指针)不判断目标数组是否能够容纳读入的字符,可能导致存储溢出(不建议使用),而fgets使用三个参数: char * fgets(char *s, int size, FILE *stream);第一个参数和gets一样,用于存储输入的地址,第二个参数为整数,表示输入字符串的最大长度,最后一个参数就是文件指针 , 指向要读取的文件 。最 后是fscanf,与scanf类似 , 只不过增加了一个参数用于指定操作的文件 , 比如fscanf(fp,"%s",words)文件IO中使用read函数用于读取open函数打开的文件 , 函数原型如下:ssize_t numread=read(int fd,void *buf,size_t qty);其中fd就是open返回的文件描述符 , buf用于存储数据的目的缓冲区,而qty指定要读取的字节数 。如果成功读取,就返回读取的字节数目(小于等于qty)4. 判断文件结尾如果尝试读取达到文件结尾 , 标准IO的getc会返回特殊值EOF,而fgets碰到EOF会返回NULL,而对于*nix的read函数,情况有所不 同 。read读取qty指定的字节数,最终读取的数据可能没有你所要求的那么多(qty),而当读到结尾再要读的话 , read函数将返回0.5. 写文件:putc,fputs,fprintf和write与读文件相对应的 , 标准C语言I/O使用putc写入字符 , 比如:putc(ch,fp);第一个参数是字符 , 第二个是文件指针 。而fputs与此类似:fputs(buf,fp);仅仅是第一个参数换成了字符串地址 。而fprintf与printf类似 , 增加了一个参数用于指定写入的文件,比如:fprintf(stdout,"Hello %s.\n","dennis");切记fscanf和fprintf将FILE指针作为第一个参数,而putc,fputs则是作为第二个参数 。在文件IO中提供write函数用于写入文件,原型与read类似:ssize_t result=write(int fd,void *buf ,size_t amt);fd是文件描述符 , buf是将要写入的内存数据,amt是要写的字节数 。如果写入成功返回写入的字节数,通过result与amt的比较可以判断是否写入正常,如果写入失败返回-16. 随机存?。篺seek()、ftell()和lseek()标准I/O使用fseek和ftell用于文件的随机存取 , 先看看fseek函数原型int fseek(FILE *stream, long offset, int whence);第一个参数是文件指针,第二个参数是一个long类型的偏移量(offset),表示从起始点开始移动的距离 。第三个参数就是用于指定起始点的模式,stdio.h指定了下列模式常量:SEEK_SET文件开始处SEEK_CUR当前位置SEEK_END文件结尾处看几个调用例子:fseek(fp,0L,SEEK_SET); //找到文件的开始处fseek(fp,0L,SEEK_END); //定位到文件结尾处fseek(fp,2L,SEEK_CUR); //文件当前位置向前移动2个字节数而ftell函数用于返回文件的当前位置,返回类型是一个long类型,比如下面的调用:fseek(fp,0L,SEEK_END);//定位到结尾long last=ftell(fp); //返回当前位置那么此时的last就是文件指针fp指向的文件的字节数 。与标准I/O类似,*nix系统提供了lseek来完成fseek的功能 , 原型如下:off_t lseek(int fildes, off_t offset, int whence);fildes是文件描述符,而offset也是偏移量,whence同样是指定起始点模式,唯一的不同是lseek有返回值,如果成功就 返回指针变化前的位置,否则返回-1 。whence的取值与fseek相同:SEEK_SET,SEEK_CUR,SEEK_END,但也可以用整数 0,1,2相应代替 。5,io的实例是什么package cn.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Iterator;/*** NIO服务端* @author 小路*/public class NIOServer//通道管理器private Selector selector;/*** 获得一个ServerSocket通道,并对该通道做一些初始化的工作* @param port绑定的端口号* @throws IOException*/public void initServer(int port) throws IOException// 获得一个ServerSocket通道ServerSocketChannel serverChannel = ServerSocketChannel.open();// 设置通道为非阻塞serverChannel.configureBlocking(false);// 将该通道对应的ServerSocket绑定到port端口serverChannel.socket().bind(new InetSocketAddress(port));// 获得一个通道管理器this.selector = Selector.open();//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,//当该事件到达时,selector.select()会返回 , 如果该事件没到达selector.select()会一直阻塞 。serverChannel.register(selector, SelectionKey.OP_ACCEPT);}/*** 采用轮询的方式监听selector上是否有需要处理的事件 , 如果有,则进行处理* @throws IOException*/@SuppressWarnings("unchecked")public void listen() throws IOExceptionSystem.out.println("服务端启动成功!");// 轮询访问selectorwhile (true)//当注册的事件到达时,方法返回;否则,该方法会一直阻塞selector.select();// 获得selector中选中的项的迭代器,选中的项为注册的事件Iterator ite = this.selector.selectedKeys().iterator();while (ite.hasNext())SelectionKey key = (SelectionKey) ite.next();// 删除已选的key,以防重复处理ite.remove();// 客户端请求连接事件if (key.isAcceptable())ServerSocketChannel server = (ServerSocketChannel) key.channel();// 获得和客户端连接的通道SocketChannel channel = server.accept();// 设置成非阻塞channel.configureBlocking(false);//在这里可以给客户端发送信息哦channel.write(ByteBuffer.wrap(new String("向客户端发送了一条信息").getBytes()));//在和客户端连接成功之后 , 为了可以接收到客户端的信息,需要给通道设置读的权限 。channel.register(this.selector, SelectionKey.OP_READ);// 获得了可读的事件} else if (key.isReadable())read(key);}}}}/*** 处理读取客户端发来的信息 的事件* @param key* @throws IOException*/public void read(SelectionKey key) throws IOException// 服务器可读取消息:得到事件发生的Socket通道SocketChannel channel = (SocketChannel) key.channel();// 创建读取的缓冲区ByteBuffer buffer = ByteBuffer.allocate(10);channel.read(buffer);byte[] data = http://www.lisdn.com/gkrj/shzs/buffer.array();String msg = new String(data).trim();System.out.println("服务端收到信息:"+msg);ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());channel.write(outBuffer);// 将消息回送给客户端}/*** 启动服务端测试* @throws IOException*/public static void main(String[] args) throws IOExceptionNIOServer server = new NIOServer();server.initServer(8000);server.listen();}}客户端:Java代码package cn.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.util.Iterator;/*** NIO客户端* @author 小路*/public class NIOClient//通道管理器private Selector selector;/*** 获得一个Socket通道,并对该通道做一些初始化的工作* @param ip 连接的服务器的ip* @param port连接的服务器的端口号* @throws IOException*/public void initClient(String ip,int port) throws IOException// 获得一个Socket通道SocketChannel channel = SocketChannel.open();// 设置通道为非阻塞channel.configureBlocking(false);// 获得一个通道管理器this.selector = Selector.open();// 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调//用channel.finishConnect();才能完成连接channel.connect(new InetSocketAddress(ip,port));//将通道管理器和该通道绑定 , 并为该通道注册SelectionKey.OP_CONNECT事件 。channel.register(selector, SelectionKey.OP_CONNECT);}/*** 采用轮询的方式监听selector上是否有需要处理的事件 , 如果有,则进行处理* @throws IOException*/@SuppressWarnings("unchecked")public void listen() throws IOException// 轮询访问selectorwhile (true)selector.select();// 获得selector中选中的项的迭代器Iterator ite = this.selector.selectedKeys().iterator();while (ite.hasNext())SelectionKey key = (SelectionKey) ite.next();// 删除已选的key,以防重复处理ite.remove();// 连接事件发生if (key.isConnectable())SocketChannel channel = (SocketChannel) key.channel();// 如果正在连接,则完成连接if(channel.isConnectionPending())channel.finishConnect();}// 设置成非阻塞channel.configureBlocking(false);//在这里可以给服务端发送信息哦channel.write(ByteBuffer.wrap(new String("向服务端发送了一条信息").getBytes()));//在和服务端连接成功之后,为了可以接收到服务端的信息 , 需要给通道设置读的权限 。channel.register(this.selector, SelectionKey.OP_READ);// 获得了可读的事件} else if (key.isReadable())read(key);}}}}/*** 处理读取服务端发来的信息 的事件* @param key* @throws IOException*/public void read(SelectionKey key) throws IOException//和服务端的read方法一样}/*** 启动客户端测试* @throws IOException*/public static void main(String[] args) throws IOExceptionNIOClient client = new NIOClient();client.initClient("localhost",8000);client.listen();}}

    推荐阅读