文件操作之文本文件读取

目录

首先要有这样一个概念

文件操作步骤

 >>与getline的区别

文件操作两种方式

字符数组方式

string类方式

getline()两种类型

成员函数 getline 

库函数getline

while()

接下来理解一下

总结

例题


首先要有这样一个概念

文件读取:

  input:数据流动是 外部存储设备到内存

  output:数据流动是 内存到外存

例如:

最常用的cin和cout

 cin是关联了输入设备(也就是键盘) 

 cout是关联了输出设备,向他关联的对象(也就是屏幕)上输送。

 >> 是std的命名空间,预先定义好了输入对象

 <<插入到输入流中

而定义文件流对象后:

fstream infile,outfile;

infile定义后:infile>>x;关联的外设不再是键盘,而是文件

outfile定义后:outfile<<x;关联的外设不再是屏幕,而也是文件

文件操作步骤

  • 定义一个文件流对象
  • 打开文件
  • 对文件读写操作
  • 关闭文件

 >>与getline的区别

>>:提取运算符,如果该文件中没有空格,能被读出来,遇到空格、回车、tab(制表)等非法字符会结束。

getline:结束条件只有读完所有或者遇到回车,可以读空格。

文件操作两种方式

字符数组方式

#include<iostream>
using namespace std;
#include<fstream>

int main() {
	//创建输入流对象
	ifstream input;
	char name[80] ,str[80];
	cout << "请输入文件名:" << endl;
	cin >> name;
	//打开文件
	input.open(name);
	if (!input) {
		cout << "文件打开失败" << endl;
		exit(1);
	}
	else {
		//读
		while (input.getline(str,80))
			cout << str << endl;
		input.close();
		
	}
	return 0;
}

这里值得注意的是:

char text[] :字符串数组末尾若没有 '\0',只能当做数组处理

若有 '\0',可以看做字符串,可以cou<<text,否则不可以。

 

所以字符数组数组在末尾要加上‘\0’;

补充

  • 用字符串初始化字符数组时,系统会在字符数组的末尾自动加上一个字符"\0",因此数组的大小比字符串中实际字符的个数大1。如:sizeof(str1)=strlen(str1) +1;sizeof会计入‘\0’,strlen不会。
  •  在内存中,就是根据"\0"来确认字符串,如果找不到就会沿着字符一直找下去。它占用内存空间,但是不计入串长。

用途:

可以用它作为循环结束的条件:

for(int i =0;str[i]!='\0';i++)

string类方式

#include<iostream>
using namespace std;
#include<string>
#include<fstream>
//string类
int main() {
	//创建输入流对象
	fstream file;
	string name ,str(" 90");
	cout << "请输入文件名" << endl;
	cin >> name;
	file.open(name);
	if (!file) {
		cout << "输入文件错误" << endl;
	}
	while (getline(file, str))
	{
		cout << str << endl;
	};
	
	
	//关闭文件
	file.close();

	return 0;
}

string 对象没有  ‘\0’

getline()两种类型

成员函数 getline 

  getline()函数有两种重载形式:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

作用是:

        从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,如果遇到delim或字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。

函数的变量:

       s给一个地址 ,用来存储输入流中的流信息。

       n:最大读取长度

       char:结束字符,默认是回车。

结束只有两种情况: 

  1. 读完所有
  2. 遇到回车

库函数getline

在string类型中的四种重载形式:

istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

    函数的变量:
      is :表示一个输入流,例如 cin,读取的istream是作为参数is传进函数的。
      str :string类型引用,用来存储输入流中的流信息,读取的字符串保存在string类型的str中。
      delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

    结束条件:

      读入了文件结束标志

      读到一个新行(有重载函数可以指定行分隔符,默认是"\n".)

      达到字符串的最大长度

      如果getline没有读入字符,将返回false,可用于判断文件是否结束。

while()

接下来理解一下

while(cin>>a);
while(getline(cin,str));
while(file,str);//file是一个输入流对象
#include<iostream>
using namespace std;
#include<string>
#include<fstream>
int main() {
	int a;
	while (cin >> a) {
		cout << a << endl;
	}
	/*
	这里很容易误以为while判断语句的判断对象是line(也就是line是否为空)
    然后想通过直接回车(即输入一个空的line)跳出循环,却发现怎么也跳不出循环
	这是因为回车只会终止getline()函数的读入操作
	而getline()函数终止后又进行while()判断
   (即判断输入流是否有效,但是现在的输入流依然有效,因为返回的输入流对象是为真满足条件)
     所以又运行getline()函数,导致程序永远跳不出循环
     直到输入了EOF或者ctrl+z,while循环才会结束
	*/
	
	return 0;
}
#include<iostream>
using namespace std;
#include<string>
#include<fstream>
int main() {
	ifstream file;
	string str;
	file.open("datas.txt");
	while (getline(file, str))
	{
		cout << str << endl;
	}

	/*
	类比于上面的cin,这里的getline是将file里的内容一行一行的读到str里
    对于file里的文件对象(data.txt)里的本身存在的换行
    就好比于上述提到的敲回车不会终止(只是暂停接着走while循环的内部)
	这样结束的就只是getline()函数的读入操作,而不是循环。
	
    getline()函数终止后,又进行while()判断,因为按行读,到没读完之前,输入流都是有效的
   (循环结束的条件是读完或者遇到回车)
    读完所有到最后一行geiline()返回得到的file对象为假,不满足条件,所以就退出循环
	
    file对象为假的理解:就是到末尾了,再往后没东西就表示到了末尾了,得到的file对象变为假。
	*/
	return 0;
}

总结

      判断while()是否结束循环的条件不是输入流是否输入了回车(或getline函数里你自己定义的结束符),而是getline这个函数是否输入无效,  while判断语句的真实判断对象是cin的状态,也就是判断当前是否存在有效的输入流。

        即读取到文件末尾的时候就不能再读取了,这个时候就会读取失败,这样循环就结束了。就是到了末尾了,再往后没东西就表示到了末尾了

例题

datas.txt文件内容:

##Safda 45sfas  df45 DASSA
dsfsgdsgasdg
4564  842s  dfssf
dsg
 dsfg
#include<iostream>
#include<string>
using namespace std;
#include<fstream>
//采用string类型
int main()
{
	ifstream word;
	word.open("datas.txt", ios::in);
	string qi, ti;
	while (getline(word, qi))
	{
		for (int i = 0; i < qi.size(); i++)
		{
			if (isalpha(qi[i]) == 0)
			{
				continue;
			}
			else
			{
				cout << qi[i];
			}
		}
	}

	
	word.close();
}

 

  • 37
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: C++中的infile和outfile文件输入输出流对象,用于读取和写入文件。 infile用于从文件读取数据,可以通过以下方式创建: ```c++ #include <fstream> using namespace std; int main() { ifstream infile("filename.txt"); // 读取文件内容 infile.close(); return ; } ``` 其中,"filename.txt"是要读取文件名,可以是相对路径或绝对路径。读取文件内容后,需要调用infile.close()关闭文件。 outfile用于向文件中写入数据,可以通过以下方式创建: ```c++ #include <fstream> using namespace std; int main() { ofstream outfile("filename.txt"); // 写入文件内容 outfile.close(); return ; } ``` 同样,"filename.txt"是要写入的文件名,可以是相对路径或绝对路径。写入文件内容后,需要调用outfile.close()关闭文件。 需要注意的是,如果文件不存在,outfile会自动创建一个新文件;如果文件已存在,outfile会覆盖原文件内容。如果需要在原文件内容后追加新内容,可以使用ofstream的open()函数: ```c++ #include <fstream> using namespace std; int main() { ofstream outfile; outfile.open("filename.txt", ios::app); // 追加文件内容 outfile.close(); return ; } ``` 其中,ios::app表示在文件末尾追加新内容。 ### 回答2: 在C语言中,文件处理是一种非常常见的操作,而infile和outfile则是两个常用的文件处理函数。这两个函数用于读取或写入文件中的数据,是C语言中非常重要的文件存储和处理函数。下面我们来详细了解一下这两个函数的用法。 1.打开文件:在使用文件处理函数时,我们首先需要打开所需的文件。可以使用fopen函数打开文件,其语法如下: FILE *fopen(const char *filename, const char *mode); 其中,filename是文件名,可以是绝对路径或相对路径,要打开的文件必须存在并且程序具有访问权限。mode是文件打开方式,包括读取、写入、追加等多种方式。例如: FILE *fp; fp = fopen("myfile.txt", "r"); 上面的代码将打开名为myfile.txt的文件,以只读模式(“r”)打开。如果文件不存在,则会返回一个空指针。 2.使用infile和outfile函数读取或写入文件:一旦文件打开成功,我们可以使用infile和outfile函数进行文件处理。这两个函数的使用方法如下: int fputc(int c, FILE *stream); int fgetc(FILE *stream); char *fgets(char *s, int n, FILE *stream); int fputs(const char *s, FILE *stream); 其中,fputc和fgetc函数分别用于写入一个字符和读取一个字符。fgets和fputs函数分别用于读取和写入一行字符,可以用于读取和写入字符串。 例如,下面的代码会从文件读取一行字符,并将其输出到控制台: char str[100]; fgets(str, 100, fp); printf("%s", str); 3.关闭文件:最后,在文件操作结束后,我们应该关闭文件,以确保程序的运行效率和稳定性。可以使用fclose函数来关闭文件,其语法如下: int fclose(FILE *stream); 例如,我们可以使用下面的代码来关闭我们之前打开的文件: fclose(fp); 综上所述,infile和outfile函数是C语言文件处理的非常重要的函数,可以用于读取和写入文件中的数据。在使用这些函数时,我们应该注意文件的打开方式和关闭方式,以保证程序的稳定性和效率。 ### 回答3: infile和outfile是在C语言中用于输入和输出文件的函数。它们使得程序能够读取和写入文件,而不仅仅是从键盘和到屏幕上。infile函数用于从文件读取数据,而outfile函数用于将数据写入文件。下面是对这两个函数的详细说明: 1. infile函数: infile函数有两个必需的参数,即文件指针和文件名。文件指针是一个指向FILE结构体的指针,它通过fopen函数打开文件并创建。文件名是指向存储文件名的字符串的指针。infile函数的用法如下: FILE *fp; char filename[50]; fp=fopen(filename,"r");/*打开filename文件*/ if(fp==NULL){ printf("Cannot open %s\n",filename); }else{ while(!feof(fp)){/*feof()函数判断是否读取完整个文件*/ /*读取文件内容*/ } fclose(fp);/*关闭文件*/ } 在以上代码中,fp指向一个名为filename的文件,以只读方式打开(也就是‘r’)。之后,我们可以使用while循环和feof函数来读取文件的内容,直到文件读取完毕。最后,我们使用fclose函数来关闭文件。 2. outfile函数: outfile函数也有两个必需的参数,即文件指针和文件名。同样地,文件指针通过fopen函数打开文件并创建。然而,这次我们使用w(写)或a(追加)来打开文件。w将会覆盖新文件(如果文件已存在),而a将会在文件末尾进行追加。outfile函数的用法如下: FILE *fp; char filename[50]; fp=fopen(filename,"w");/*创建filename文件*/ if(fp==NULL){ printf("Cannot create %s\n",filename); }else{ /*写入文件内容*/ fclose(fp);/*关闭文件*/ } 在以上代码中,我们创建了一个名为filename的新文件。之后,我们可以使用fwrite函数来写入文件的内容。最后,我们使用fclose函数来关闭文件。 总之,infile和outfile是用于读取和写入文件的C语言函数。它们可以通过文件指针和文件名来打开,从而使程序能够读取或写入文件。使用这两个函数需要注意的一点是,我们必须在程序结束前关闭文件。否则,文件可能会出现一些问题(例如,无法正常打开或保存)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值