文件的读和写(基础用法)

主要介绍下fstream(filestream—文件流),ostream,istream。涉及到文件的一些流操作要包含头文件fstream

#include <stream>
ofstream     //文件写操作,内存写入存储
istream       //文件读操作,存储读<pre name="code" class="cpp">ofstream out;
out.open("hello.txt",ios::in|ios::out|ios::binary)

到内存fstream //可对文件进行读写操作


1.打开文件

在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联

打开文件的代码。open()函数的参数有文件名,打开文件的方式。文件名可以使用相对路径或绝对路径表明文件所在的位置。

ofstream out;  
out.open("Hello.txt", ios::in|ios::out|ios::binary)                 

2.文本文件的读写操作

void Salary::read_data( )  
{  
    int i;  
    ifstream infile("salary.txt",ios::in);   //以输入的方式打开文件  
    if(!infile)                 //测试是否成功打开  
    {  
        cerr<<"open error!"<<endl;  
        exit(1);  
    }  
    i=0;  
    while(infile>>salarys[i])  
        i++;  
    number=i;  
    infile.close();  
}  
<span style="background-color: rgb(255, 255, 255);">
</span>
<pre name="code" class="cpp">void Salary::write_data( )  
{  
    int i;  
    ofstream outfile("salary_ordered.txt",ios::out);   //以输入的方式打开文件  
    if(!outfile)                 //测试是否成功打开  
    {  
        cerr<<"open error!"<<endl;  
        exit(1);  
    }  
    for(i=0; i<number; ++i)  
    {  
        outfile<<salarys[i]<<endl;  
    }  
    outfile.close();  
}  

文件流类与文件流对象

文件流是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。

请区分文件流与文件的概念。文件流本身不是文件,而只是以文件为输入输出对象的流。若要对磁盘文件输入输出,就必须通过文件流来实现。要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。例如ofstream  out;就是定义了一个输出流对象




<think>好的,用户现在想要了解如何在Node.js中文件。首先,我需要回忆一下Node.js的核心模块,特别是fs模块,因为这是处理文件系统的主要模块。用户可能对Node.js有一定了解,但可能还不熟悉具体的文件操作方法。 接下来,我应该先介绍基本的文件文件的方法。记得Node.js的fs模块有同步异步两种方法,还有基于Promise的版本。需要分别说明这几种方式的区别使用场景,帮助用户根据需求选择合适的方法。 用户可能关心的是代码示例,所以需要给出具体的例子。比如,使用fs.readFilefs.writeFile的异步方法,以及同步方法,还有fs.promises的用法。同时,要提醒用户注意错误处理,尤其是在异步操作中,避免程序崩溃。 另外,用户可能对文件操作的性能处理大文件的情况感兴趣。这时候需要提到流(stream)的概念,比如使用fs.createReadStreamfs.createWriteStream来处理大文件,避免内存占用过高。但可能用户的问题比较基础,暂时不需要深入流的内容,不过可以作为进阶部分简要提及。 需要检查代码示例是否正确,确保语法正确,路径处理正确,比如使用path模块来处理文件路径,避免不同操作系统的兼容性问题。同时,强调回调函数中的错误优先处理模式,这是Node.js常见的实践。 用户可能遇到的常见问题包括文件路径错误、权限问题、文件不存在导致的错误等,应该在注意事项部分提到这些,并给出解决建议,比如使用try-catch块处理同步方法,或者检查文件是否存在再操作。 最后,总结一下不同方法的优缺点,帮助用户根据具体情况选择同步还是异步,或者Promise方式。确保回答结构清晰,步骤明确,用户能够逐步理解应用。</think>在 Node.js 中,文件主要通过内置的 `fs` (File System) 模块实现。以下是详细的实现方法注意事项: --- ### 一、基础文件操作 #### 1. **同步 vs 异步** - **同步方法**:阻塞式操作(方法名带 `Sync` 后缀),适合简单脚本 - **异步方法**:非阻塞式操作(默认),适合生产环境 #### 2. **常用 API 对比** | 操作类型 | 同步方法 | 异步方法 | Promise 版本 (fs.promises) | |----------|------------------------|---------------------------|---------------------------| | 文件 | `writeFileSync` | `writeFile` | `writeFile` | | 文件 | `readFileSync` | `readFile` | `readFile` | | 追加内容 | `appendFileSync` | `appendFile` | `appendFile` | | 删除文件 | `unlinkSync` | `unlink` | `unlink` | --- ### 二、代码示例 #### 📌 基础法 ```javascript const fs = require('fs'); const path = require('path'); // 推荐使用绝对路径 const filePath = path.join(__dirname, 'demo.txt'); ``` ##### 1. **文件** ```javascript // 异步入(覆盖模式) fs.writeFile(filePath, 'Hello World', 'utf8', (err) => { if (err) throw err; console.log('文件入成功'); }); // 同步入 try { fs.writeFileSync(filePath, '同步入内容', 'utf8'); } catch (err) { console.error(err); } ``` ##### 2. **文件** ```javascript // 异步取 fs.readFile(filePath, 'utf8', (err, data) => { if (err) throw err; console.log('文件内容:', data); }); // 同步取 try { const content = fs.readFileSync(filePath, 'utf8'); console.log(content); } catch (err) { console.error(err); } ``` ##### 3. **追加内容** ```javascript fs.appendFile(filePath, '\n追加内容', (err) => { if (err) throw err; console.log('内容已追加'); }); ``` --- ### 三、Promise 法(推荐) ```javascript const fs = require('fs').promises; async function fileOperations() { try { // 入 await fs.writeFile(filePath, 'Promise 入'); // 取 const data = await fs.readFile(filePath, 'utf8'); console.log('取结果:', data); // 追加 await fs.appendFile(filePath, '\nPromise 追加'); } catch (err) { console.error('操作失败:', err); } } fileOperations(); ``` --- ### 四、流式操作(大文件处理) 使用 `createReadStream` `createWriteStream` 处理大文件: ```javascript const readStream = fs.createReadStream('largeFile.mp4'); const writeStream = fs.createWriteStream('copy-largeFile.mp4'); readStream.pipe(writeStream); readStream.on('end', () => { console.log('大文件复制完成'); }); writeStream.on('error', (err) => { console.error('入失败:', err); }); ``` --- ### 五、注意事项 1. **路径问题**: - 始终使用 `path.join()` 处理路径 - 区分 `__dirname`(当前文件目录) `process.cwd()`(运行目录) 2. **编码格式**: - 文本文件建议指定编码(如 `utf8`) - 二进制文件(如图片)不指定编码 3. **错误处理**: - 异步操作必须处理回调错误 - 同步操作使用 `try/catch` 4. **文件锁**: - 避免同时同一个文件 - 必要时使用文件锁(如 `proper-lockfile` 库) 5. **性能优化**: - 小文件(<100MB)可用 `readFile/writeFile` - 大文件必须使用流(Stream)操作 --- ### 六、文件操作流程图 ``` 开始 │ ├── 文件流程 │ ├─ 检查文件是否存在? → 否 → 创建新文件 │ └─ 是 → 清空内容入 │ ├── 文件流程 │ ├─ 检查文件是否存在? → 否 → 抛出错误 │ └─ 是 → 取内容 │ └── 追加流程 └─ 直接在文件末尾添加内容 ``` --- 通过合理选择同步/异步方法流式操作,可以高效安全地实现 Node.js 文件。建议优先使用 Promise 配合 `async/await` 法,既能保证代码可性,又能避免回调地狱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值