关于c++文件流读入和写入的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c++文件流读入和写入的问题相关的知识,希望对你有一定的参考价值。

用文件保存一段数字,比如“001 123 002 222 003 000”
现在希望写一段代码实现:
打开该文件然后判断输入的数字是文件中的哪一个(比如可以是002)
然后将这个数字的下一组数字保存到一个变量中(比如可以是输入002,然后将002下一组数字,即222输入到自己定义的一个变量数组中)
谢谢你们的帮忙!

第二个问题:
1、gets(str);
是从缓冲区中读取字符串,然后保存到数组str中直到遇到回车符,换行符不作为字符串的内容,读取的换行符会转换为NULL值,由此标志程序的结束。

2、cin.getline(char*line,int size,char ='"n')是读入一行字符,第二个参数是本次读取的最大字符个数,第三个参数是分隔字符,作为读取一行结束的标志,默认是\n。

3、cin.get()第一个用法,是读入一个字符。 cin.get()第二个用法,也是输入一行(同cin.getline()),但是区别就是,不输出分隔符

补充一下:
cin.getline() 与 cin>>str 的一个不同是,前者输入一行,行中可以包含空格,后者却以空格或回车作为字串结束,不包含空格。

补充:get() 和getline()的异同
1)相同点:
要获取一行的输入,标准流类的成员函数getline(),get()都有三个参数,比如getline(char*line,int size,char ='\n')。其中第一个参数指向存储结果字符的缓冲区指针,第二个表示缓冲区大小(本次读取的最大字符个数,不能够超过其限度),第三个表示知道什么时候停止读输入的终止符(读取一行结束的标志)。终止符有一个经常用到的缺省值"\n"。两个函数遇到输入终止符时,都把零储存在结果缓冲区里。
2)不同点:
1.一般来讲,get()一次读入一个字符,getline()一次读入一行字符
2.在处理字符串时,get()遇到输入流的分隔符时就停止,而不从输入流中提取分隔符。比如用cin.get(myarray1,20,'*'); 处理字符串1111*2222,碰到*就停止。cout<<myarray1;会输出1111。然后再调用cin.get(ch1),cout<<ch1;输出的还是这个分隔符*。getline()与其相反,它从输入流中提取分隔符,但仍没有把它储存在结果缓冲区里。如果用cin.getline(myarray2,20,'*');处理上面同样的字符串1111*2222,碰到*停止。 cout<<myarray2;会输出1111。然后再调用cin.get(ch2),cout<<ch2;输出的是分隔符后面的2。

3)代码演示:
#include <iostream>
#include <iomanip>
using namespace std;

void main()

char myarray1[20],myarray2[20];
cin.get(myarray1,20,'*');
cout<<myarray1;
char ch1;
cin.get(ch1);
cout<<ch1;

cin.getline(myarray2,20,'*');
cout<<myarray2;
cin.get(ch1);
cout<<ch1;


4)read 函数和 write函数
最近开始从事搜索引擎的工作,所以又重新开始了c/c++的旅程,时隔4年
不得不复习一下c/c++其中的内容,以下内容有网上别的朋友发表的,也有我自己总结的.
1. read
#include
ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:读取到的字节数;0(读到 EOF);-1(出错)
read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes :
A. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100
字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。
B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。
C. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。
D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。
E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。
F. 在读取了部分数据时被信号中断。
读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。
2. write
#include
ssize_t write(int filedes, const void *buf, size_t nbytes);

返回值:写入文件的字节数(成功);-1(出错)
write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。
对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。
From : antigloss
参考技术A 第二个问题:
1、gets(str);
是从缓冲区中读取字符串,然后保存到数组str中直到遇到回车符,换行符不作为字符串的内容,读取的换行符会转换为NULL值,由此标志程序的结束。

2、cin.getline(char*line,int size,char ='"n')是读入一行字符,第二个参数是本次读取的最大字符个数,第三个参数是分隔字符,作为读取一行结束的标志,默认是\n。

3、cin.get()第一个用法,是读入一个字符。 cin.get()第二个用法,也是输入一行(同cin.getline()),但是区别就是,不输出分隔符

补充一下:
cin.getline() 与 cin>>str 的一个不同是,前者输入一行,行中可以包含空格,后者却以空格或回车作为字串结束,不包含空格。

补充:get() 和getline()的异同
1)相同点:
要获取一行的输入,标准流类的成员函数getline(),get()都有三个参数,比如getline(char*line,int size,char ='\n')。其中第一个参数指向存储结果字符的缓冲区指针,第二个表示缓冲区大小(本次读取的最大字符个数,不能够超过其限度),第三个表示知道什么时候停止读输入的终止符(读取一行结束的标志)。终止符有一个经常用到的缺省值"\n"。两个函数遇到输入终止符时,都把零储存在结果缓冲区里。
2)不同点:
1.一般来讲,get()一次读入一个字符,getline()一次读入一行字符
2.在处理字符串时,get()遇到输入流的分隔符时就停止,而不从输入流中提取分隔符。比如用cin.get(myarray1,20,'*'); 处理字符串1111*2222,碰到*就停止。cout<<myarray1;会输出1111。然后再调用cin.get(ch1),cout<<ch1;输出的还是这个分隔符*。getline()与其相反,它从输入流中提取分隔符,但仍没有把它储存在结果缓冲区里。如果用cin.getline(myarray2,20,'*');处理上面同样的字符串1111*2222,碰到*停止。 cout<<myarray2;会输出1111。然后再调用cin.get(ch2),cout<<ch2;输出的是分隔符后面的2。

3)代码演示:
#include <iostream>
#include <iomanip>
using namespace std;

void main()

char myarray1[20],myarray2[20];
cin.get(myarray1,20,'*');
cout<<myarray1;
char ch1;
cin.get(ch1);
cout<<ch1;

cin.getline(myarray2,20,'*');
cout<<myarray2;
cin.get(ch1);
cout<<ch1;


4)read 函数和 write函数
最近开始从事搜索引擎的工作,所以又重新开始了c/c++的旅程,时隔4年
不得不复习一下c/c++其中的内容,以下内容有网上别的朋友发表的,也有我自己总结的.
1. read
#include
ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:读取到的字节数;0(读到 EOF);-1(出错)
read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes :
A. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100
字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。
B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。
C. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。
D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。
E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。
F. 在读取了部分数据时被信号中断。
读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。
2. write
#include
ssize_t write(int filedes, const void *buf, size_t nbytes);

返回值:写入文件的字节数(成功);-1(出错)
write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。
对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。
From : antigloss
另外,团IDC网上有许多产品团购,便宜有口碑
参考技术B

代码如下:

fstream  // 文件流
ifstream  // 输入文件流
ofstream  // 输出文件流
//创建一个文本文件并写入信息
//同向屏幕上输出信息一样将信息输出至文件
#include<iomanip.h>
#include<fstream.h>
void main()

  ofstream f1("d:\\\\me.txt");           
//打开文件用于写,若文件不存在就创建它
  if(!f1)return;                 
//打开文件失败则结束运行
  f1<<setw(20)<<"姓名:"<<"廉东方"<<endl;     
//使用插入运算符写文件内容
  f1<<setw(20)<<"家庭地址:"<<"河南郑州"<<endl;
  f1.close();                   
 //关闭文件

参考技术C 连着写肯定找不到,要用空格判断吧
while不是文件尾,
fgetc==‘ ’
每次找到空格,将空格后面的到下个空格之间的字符用fgetc得到,存入数组里面,与输入的字符串进行比较

这样可以么

java文件读写

java能否像C那样可以用fseek之类的东西实现文件同时读写
是否必须要关闭读流才能打开写流
比如我要读入8个字节,修改,写回去,再读后面的八字节……这样循环
如果反复开关效率太低了
能否有实现文件同时读写或者效率高的算法?一直用C,初学java,别太难,谢谢

在网上查了很多关于修改文件的方法,不得其要领。自己想了两个取巧的办法,来解决对文件的修改。一:读取一个文件file1(FileReader and BufferedReader),进行操作后写入file2(FileWriter and BufferedWriter),然后删除file1,更改file2文件名为file1(Rename()方法)。二:创建字符缓冲流(StringBuffer),读取文件内容赋给字符缓冲流,再将字符缓冲流中的内容写入到读取的文件中。例如: test.txt 这里是放在d盘的根目录下,内容如下 able adj 有才干的,能干的 active adj 主动的,活跃的 adaptable adj 适应性强的 adroit adj 灵巧的,机敏的 运行结果生成在同目录的 test1.txt中 able #adj*有才干的,能干的 active #adj*主动的,活跃的 adaptable #adj*适应性强的 adroit #adj*灵巧的,机敏的 代码: public class Test public static void main(String[] args) throws Exception BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt")); StringBuffer sb = new StringBuffer(); String lineContent = null ;while( (lineContent = br.readLine()) != null) String[] sp = lineContent.split(" ");sp[0] = sp[0].concat(" *");sp[1] = sp[1].concat("# ");for(int i=0;i sb.append(sp[i]);sb.append("\r\n");FileWriter fw = new FileWriter("D:\\test2.txt"); fw.write(sb.toString()); br.close(); fw.close();

参考资料:http://blog.csdn.net/zoubianhaiyang/archive/2008/04/28/2336981.aspx

参考技术A java.io.RandomAccessFile这个是你想要的,RandomAccessFile(File file, String mode)
mode参数就是你所说的只读还是读写等
参考技术B 反复读写最好还是在内存中进行,把最后结果输出到文件中。
java中ByteArrayInputStream和ByteArrayOutputStream可以对内存读写。
参考技术C 来学习.........

以上是关于关于c++文件流读入和写入的问题的主要内容,如果未能解决你的问题,请参考以下文章

java--文本文件写入

C++ 高级教程:C++ 文件和流

Java 输入输出——流

C++入门文件流(fstream)介绍和使用

Java之文件IO流详解完结

文件操作