C/C++程序从文本文件中读取(保存)数据

  • 在C程序中:

与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换。

——文件流:C标准库提供了FILE(之所以命名为FILE,因为linux将所有机制都视为文件) ,FILE对象是一个包含了管理流所需的所有信息的结构,包括缓冲区信息、各种标记(如文件结束标记和错误标记)以及用于实际I/O的文 件描述符等。

——输入流,输入流:数据从文件传送到内存的叫输入流,数据从内存传送到文件的叫输出流。

——打开文件:FILE对象通过调用fopen函数创建的。如: FILE *fp, fp=fopen("filename","r"), 表示以只读的方式建立与filename相关的文件流;filename为当前目录下的相对路径名,r代表可读(打开文件的模式)。 

一:读取

1:对一些有规范格式文件的读取,可使用标准库stdio.h下的fscanf函数,

函数原型为:int fscanf(FILE * stream, const char * format, [argument...])

如读取文件data.txt(数据格式相对规范)

代码实现读取:

//test.c
//文件读取
  #include<stdio.h>
  
  int main()
  {
    //1:创建文件流,文件指针名=fopen(文件名,使用文件方式)打开失败则返回NULL;
    FILE *fp=fopen("./data.txt","r"); //以data.txt文件为例

    //2:检测文件是否打开成功;
    if(!fp){
       printf("打开失败!\n");
       return -1; //返回异常
    }
    //3:
    int num; //用来储存一个整型数据
    char name[10], place[10]; //用来储存两个字符串数据

    //抽象理解:
    //理解文件位置含义:其表示已打开文件当前可读写字符的位置,其表示为一个到文件头的整数;
    //fscanf在读取数据时可以这样理解:文件被打开后,它就成了一个无序字节流(水流),其会通过一个管道,流向被读取的一端;
    //了解fscanf后知道,其遇到空格字符(空格,制表符),换行符,就会停止,这里的停止我们可以理解为:
    //停下来为文件中两个不相关的数据块做一个分隔的操作,刚好适应了我们一般将空字符(包括换行符)作为两个数据之间的分隔的行为;
    //我们只需理解管道的两端
    //流进管道的一端的位置,就是文件的位置,表示已被读到的位置。
    //流出管道一端,就是进程用来读取数据的一端,其可以对管道中已经做区分的数据进行读取。
   
   //4:读取:
    fscanf(fp,"%d%s%s",&num, name,place); //fscanf对流的格式化读取。
    //注1:fscanf(fp,"%da%s%s",&num,name,place); 可以实现对数据:1a小刚 河南;的准确读取,表示两个数据之间以a为界。
    //注2:因为流是指针的性质,所以函数是将各数据块的首地址交给对应参数,所以num需进行&取地址操作,
    //注3:因为name,place本身已表达地址,所以不用改变;

    fscanf(fp,"\n");
    //\n为控制字符,此时文件的位置到了第二行的开始;

    //接着进行操作:fscanf(fp,"%d%s%s",&num, name,place);就可以继续读取第二行
    //所以我们常常只需利用一个while语句就可以将整个文件读取到一个数据结构(进程)中
    /*
    while(!feof(fp)) //feof()检测一个文件是否结束,即到达文件尾,若结束,则返回非0值,否则返回0
    {
       fscanf(fp,"%d%s%s\n",&num, name,place); 
    }
    */
 
    //检测读取结果
    printf("%d %s %s\n",num, name, place);
 
    //关闭流
    fclose(fp); 
    
    return 0;

 }
​

程序运行结果:

2:从文件中读取整行数据(标准库stdio.h下的fgets

函数原型:char *fgets(char *str, int n, FILE *stream); 

其从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,遇到空格不停止;

例从文件中读取一行数据:

代码实现:

//test3.c
//行读取文件数据

#include<stdio.h>
#define maxlen 30

int main()
{
    //创建文件流
    FILE *fp=fopen("./data.txt","r");
    
    //2:检测文件是否打开成功;
    if(!fp){
       printf("打开失败!\n");
       return -1; //返回异常
    }
    char str[maxlen];//缓冲区,用来储存数据

    //从文件中读取一行数据,储存到str开始的地址,最大长度为maxlen,然后下次读取从下行开始
    //如果该行的数据长于maxlen-1,则只能返回一个不完整的行,并下次调用时从该处开始
    fgets(str,maxlen,fp);

    //检测结果
    printf("%s\n",str);

    //关闭流
    fclose(fp);
    return 0;

}

运行结果:


二:保存

1:保存与读取往往相关联,保存格式决定了你读取的方式,使用函数fprintf可以进行指定格式的保存:

函数原型为:int fprintf( FILE *stream, const char *format, [ argument ]...) 

假设保存一个人的个人信息到文件中:

 

/*test2.c */
//数据保存

#include<stdio.h>

int main()
{
    //例一个人的信息
    int num=1;
    char name[10]="小明";
    char place[10]="河南";

    //建立与文件的流
    FILE *fp=fopen("./data.txt","w");
    
    //2:检测文件是否打开成功;
    if(!fp){
       printf("打开失败!\n");
       return -1; //返回异常
    }

    //将数据格式化输出到指定文件流,int fprintf( FILE *stream, const char *format, [ argument ]...) 
    //注:此函数,是将format字符串写入到指定输出流中,format包括空格字符,非空格字符,说明符之中的一个或多个。如:fprintf(fp," "); 就是将空格输入到流中。
    //可理解为进程借助流将数据打印(fprintf)到了文件中;

    //将个人信息,写入指定流中,数据间以一个空格分隔,最后还写入换行符(控制字符)。
    fprintf(fp,"%d %s %s\n",num, name,place);

    //所以常常只要利用一个while语句就可以将讲一个表(链表,顺序表)按指定行格式写入输出流中
    /*
    while(!feof(fp)) //feof()检测一个文件是否结束,即到达文件尾,若结束,则返回非0值,否则返回0
    {
       fprintf(fp,"%d %s %s\n",num, name,place); 
    }
    */
    //关闭流
    fclose(fp);

    return 0;

}

运行结果:

2:写一个字符串到流中(fputs),函数原型:int fputs(const char *str, FILE *stream);

例:

//test4.c
//保存字符串

#include<stdio.h>

int main()
{
    //1:创建文件流,文件指针名=fopen(文件名,使用文件方式)打开失败则返回NULL;
    FILE *fp=fopen("./data.txt","a"); //以data.txt文件为例,a表示追加

    //2:检测文件是否打开成功;
    if(!fp){
       printf("打开失败!\n");
       return -1; //返回异常
    }

    //string
    char string[20]="Facing the world";

    //write string to the fstream
    fputs(string,fp);

    //关闭流
    fclose(fp);

    return 0;

}

运行结果:

浅谈c++:


在c++中我们可以使用操作符<<, >>来进行流的读写操作,更加的方便和易于理解;

具体参考下列实例:

1:读取所示数据:

代码实现:

 

//c++文件读取
#include<iostream> //输入输出流
#include<fstream> //文件流

//using namespace std; //若使用该声明,则可以不用在使用的每个标准库的成员前加std::


int main()
{
   //序号,年龄,年;
   int num, age, year;
   //姓名,地址
   char name[20], place[20];

   //c++的文件流,ifstream为输入文件流
   std::ifstream fp;

   //open为ifstream的成员函数,功能为打开文件,并将它与流关联
   fp.open("./data.txt",std::ios::in); //ios::in表示读流的方式,表示打开模式。

   //成员函数is_open检查流是否有关联文件,即打开成功与否,成功返回true,失败返回false
   if(!fp.is_open()){
       std::cout<<"打开文件失败!!\n";
       return 1;       // 返回异常;
   }

   //读取数据
   fp>>num>>year>>age>>name>>place; //使用操作符>>,将数据传输到对应的变量中

   //检测
   std::cout<<num<<":"<<name<<",age:"<<age<<",year:"<<year<<",live in:"<<place<<"\n"; //cout相当于printf

   //关闭流
   fp.close();

    return 0;
}

运行结果:

2:往文件保存数据:

实例:保存一个人的具体信息到文件data.txt中

代码实现:

 

//c++数据保存
#include<iostream> //输入输出流
#include<fstream> //文件流

//using namespace std; //若使用该声明,则可以不用在使用的每个标准库的成员前加std::


int main()
{
   //序号,年龄,年;
   int num=3;
   int age=20;
   int year=1993;
   //姓名,地址
   char name[20]="小龙";
   char place[20]="广元";

   //c++的文件流,ofstream为输出文件流
   std::ofstream fp;

   //open为ofstream的成员函数,功能为打开文件,并将它与流关联
   fp.open("./data.txt",std::ios::app); //ios::app表示每次写入是都追加到流尾,表示打开模式。

   //成员函数is_open检查流是否有关联文件,即打开成功与否,成功返回true,失败返回false
   if(!fp.is_open()){
       std::cout<<"打开文件失败!!\n";
       return 1;       // 返回异常;
   }

   //读取数据
   fp<<num<<" "<<year<<" "<<age<<" "<<name<<" "<<place<<"\n"; //使用操作符<<,将各数据传输到流所关联的文件中

   //关闭流
   fp.close();

    return 0;
}

运行结果:

作者:斤斤计较了

出处:斤斤计较了 - 博客园

  • 25
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Java读取文本文件的常用方法之一是使用 Java I/O 类库的 `BufferedReader` 类。下面是一个示例代码,它展示了如何从文件 "input.txt" 读取文本: ``` import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Main { public static void main(String[] args) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("input.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在这段代码,我们首先使用 `FileReader` 类来打开文件 "input.txt",然后使用 `BufferedReader` 类来读取文件的文本。我们使用 `while` 循环来逐行读取文件,直到文件末尾。每一行的文本都会被打印到控制台上。 注意,在这段代码,我们使用了 `try-catch-finally` 结构来处理可能发生的异常。在这种情况下,我们需要处理的异常是 `IOException`,它可能在打开文件或读取文件时发生。在 `finally` 块,我们关闭 `BufferedReader` 对象,以确保文件被正确关闭。 ### 回答2: 在Java,要从文本文件读取数据,我们可以使用文件输入流(FileInputStream)和字符输入流(FileReader)。 使用FileInputStream来读取文本文件的步骤如下: 1. 创建一个FileInputStream对象,并指定要读取文本文件的路径。 2. 创建一个字节数组来存储读取到的数据。 3. 调用read()方法读取数据,并将读取到的字节数保存在字节数组。 4. 使用String的构造方法将字节数组转换成字符串。 5. 打印或者处理字符串。 使用FileReader来读取文本文件的步骤如下: 1. 创建一个FileReader对象,并指定要读取文本文件的路径。 2. 创建一个字符数组来存储读取到的数据。 3. 调用read()方法读取数据,并将读取到的字符数保存在字符数组。 4. 使用String的构造方法将字符数组转换成字符串。 5. 打印或者处理字符串。 这是一个简单的代码示例,用于从文本文件读取数据并打印出来: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFromFile { public static void main(String[] args) { String fileName = "path/to/your/textfile.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个例子,我们使用BufferedReader来读取文件内容,并使用readLine()方法逐行读取文件数据。通过循环读取直到文件的末尾,然后将每一行数据打印出来。 请将"path/to/your/textfile.txt"替换成实际的文本文件的路径。 ### 回答3: Java程序可以使用File类和Scanner类来从文本文件读入数据。 首先,我们需要使用File类来表示文件对象,通过创建一个File对象来指定要读取的文件路径和文件名。例如:File file = new File("C:\\example.txt"); 接下来,我们可以使用Scanner类来读取文件数据。Scanner类提供了读取不同类型数据的方法,比如读取整数、浮点数、字符串等。我们可以使用Scanner类的构造函数来将File对象作为参数,创建一个Scanner对象,如:Scanner scanner = new Scanner(file); 然后,我们可以使用Scanner对象的方法来逐行读取文件数据。例如,我们可以使用nextLine()方法来读取一行数据,并将其赋值给一个字符串变量。然后我们可以对这个字符串进行处理或输出。例如:String line = scanner.nextLine(); 最后,我们需要记得在读取完文件后关闭文件。我们可以使用Scanner类的close()方法来关闭文件。如:scanner.close(); 总结来说,Java程序文本文件读入数据的大致步骤是:创建一个File对象表示要读取的文件,使用Scanner类的构造函数将File对象作为参数创建一个Scanner对象,使用Scanner对象的方法来逐行读取文件数据,对读取数据进行处理或输出,最后关闭文件。 以上是一个简单的例子来说明如何从文本文件读取数据,实际应用可能需要处理各种不同格式的文本文件,需要根据具体情况进行适当的调整和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值