c++c语言追加写入文件写入

C++写文件的时候,怎么换行写入。_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:158,210贴子:
C++写文件的时候,怎么换行写入。收藏
比如说已经有一行了,我想在第二行的开头输入,怎么实现。会的请教下。。每次输入都换行追加。
/*************************file:
log_api.hauthor: chensmdate: []*************************/#include &stdarg.h&#include &string.h&
#include &unistd.h&#include &time.h&#include &sys/time.h&#include &iostream&#include &fstream&#define BUF_SIZE 126#define TO_YEAR(year) (year + 1900)
// 转换成常用的年#define TO_MONTH(month) (month + 1)
// 转换成常用的月#define TO_MS(usec) (usec / 1000)
// 转换成常用的毫秒#define TO_US(usec) (usec % 1000)
// 转成成常用的微妙const char *curTime(){
static char time_buf[50];
struct tm *
gettimeofday(&tp, &tzp);
tf = localtime(&tp.tv_sec);
snprintf(time_buf, sizeof(time_buf), &%04d/%02d/%02d %02d:%02d:%02d.%03d.%03d&,
TO_YEAR(tf-&tm_year),
TO_MONTH(tf-&tm_mon),
tf-&tm_mday,
tf-&tm_hour,
tf-&tm_min,
tf-&tm_sec,
TO_MS(tp.tv_usec),
TO_US(tp.tv_usec));
return time_}void log_debug(char* fmt, ...){
va_list arg_//声明一个转换参数的变量
char buffer[BUF_SIZE];
char strHead[BUF_SIZE];
char *file_name = (char*)&./chensm.log&;
va_start(arg_ptr, fmt);//初始化变量
vsnprintf(buffer, BUF_SIZE, fmt, arg_ptr);//将带参数的字符串按照参数列表格式化到buffer中
va_end(arg_ptr);//结束变量;列表和va_satrt 成对使用
FILE * fd= fopen(file_name , &a+& );
sprintf(strHead, &PID: %d TIME: %s MSG: &,
getpid(), curTime());
string str = string(strHead) + string(buffer);
int count = fputs(str.c_str(),fd);
fclose(fd);
string str = string(strHead) + string(buffer);
ofstream fileOut(file_name);
if (!fileOut)
cout&& &creat file &&& file_name&& & error&&&
ostringstream strO
strOut && str.c_str();
fileOut.close();*/}
这个是我写的一个打印日志的文件,就是写入日志的时候没能换行,直接在前一句的末尾追加了,这个怎么事项换行追加。
seekp?    ------(づ ̄3 ̄)づ 我为森么辣么萌~
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C++读写CSV文件
发现它只针对文件中的一行读写,而且只能作为一个局部变量使用,或者读,或者写,不能同时兼用,更不能作为类的变量,更别说扩展了。而且,它只支持在MFC条件下实现,如果我们需要在一个模块当中呢?在一个库中呢?在非MFC中呢?不过,它的读取遍历算法和写入算法我觉得还是不错的,所以,基于此,也根据我自己工作中的需求做了改变,也在测试中达到了比较好的结果。
一般读取CSV文件我们是需要:
1、既能满足MFC,又能满足非MFC;
2、逐行读取,而不是一行,因为可能不止一行;
3、读取一行后需要针对分隔符(一般是&,&)来分析获得所有解析后的元素项,而且每一行的元素个数都不一定相同;
4、写入CSV时,针对每一行的元素之间都要添加分隔符(一般是&,&),甚至元素当中可能有诸如:冒号(&&&)、逗号(&,&)这样比较特殊的字符,我们又如何解决呢?
5、作为一个封装类,留有余地便于今后的完善和扩展。
好了,不多说了,上代码:
XCFileStream.h
#if _MSC_VER & 1000
#pragma once
#ifndef __XCFILESTREAM_H__
#define __XCFILESTREAM_H__
/// 隐藏依赖文件
/// C++系统文件
#include &string&
#include &list&
#include &vector&
#include &.h&
/// 其它库头文件
/// 本项目头文件
#define XC_ERR_NONE 0
/// 无效文件名或非指定文件格式
#define XC_ERR_INVALID_FILE_NAME (-1)
/// xun-test文件的读与写
class CXCFileStream
CXCFileStream(void);
~CXCFileStream(void);
* 函数功能:读取CSV文件,分析其中的内容,然后存储在容器中。
* 参数描述:
*&&&& [in] lpszFilename - 待读取的CSV文件;
*&&&& [in, out] vlStr - 存储分析后的CSV内容
* 返回值:
*&&&& 错误代码
* 注意:这里因为特殊愿意(目前还不清楚),不是vector&list&string&&,而是vector&list&string& &。
const int ReadCsvData(LPCTSTR lpszFilename, vector&list&string& & &vlStr);
* 函数功能:将容器中的内容经过排版、布局、添加分隔符后写入到CSV文件。
* 参数描述:
*&&&& [in] lpszFilename - 待读取的CSV文件;
*&&&& [in] vlStr - 存储分析后的CSV内容
* 返回值:
*&&&& 错误代码
* 注意:这里因为特殊愿意(目前还不清楚),不是vector&list&string&&,而是vector&list&string& &。
const int WriteCsvData(LPCTSTR lpszFilename, const vector&list&string& & &vlStr);
/// 判断是否是CSV文件
const bool IsCsvFile(LPCTSTR lpszFilename);
XCFileStream.cpp
/// 隐藏依赖文件
/// C系统文件
/// C++系统文件
#include &fstream& /// 读取映射文件
#include &algorithm&
/// 其它库头文件
/// 本项目头文件
#include &XCFileStream.h&
CXCFileStream::CXCFileStream()
CXCFileStream::~CXCFileStream(void)
const bool CXCFileStream::IsCsvFile(LPCTSTR lpszFilename)
/// 0、判断文件名是否有效
if (NULL == lpszFilename || 4 & strlen(lpszFilename))
/// 本地变量
string _strFileName(lpszFilename);
size_t _iLen = _strFileName.length();
string _strSuff(_strFileName.substr(_iLen - 4, 4));
/// 转变为小写,如果要转变为大写:tolower -& toupper 。
transform(_strSuff.begin(), _strSuff.end(), _strSuff.begin(), tolower);
/// 1、判断是否是CSV文件
return (0 == _pare(&.csv&));
const int CXCFileStream::ReadCsvData(LPCTSTR lpszFilename, vector&list&string& & &vlStr)
/// 1、判断是否是CSV文件
if (! IsCsvFile(lpszFilename))
return XC_ERR_INVALID_FILE_NAME;
/// 2、打开CSV文件
ifstream _streamFromFile(lpszFilename);
///&&& 判断打开文件是否成功
if (NULL == _streamFromFile)
return (-errno);
/// 存储读取的文件内容
string _strIn(&&);
/// 3、读取一行
while (getline(_streamFromFile, _strIn)) {
/// 每行的源字符串
LPCTSTR _pcSrc = _strIn.c_str();
/// 存储一行&,'分隔解析后的各个元素
list&string& _ltS
/// Parse values in this line
while (*_pcSrc != '\0') {
/// string to hold this value
string _strElem(&&);
/// 针对每个字符分析
if (*_pcSrc == '&') {
/// Bump past opening quote
/// Parse quoted value
while (*_pcSrc != '\0') {
/// Test for quote character
if (*_pcSrc == '&') {
/// Found one quote
// If pair of quotes, keep one
// Else interpret as end of value
if (*_pcSrc != '&') {
/// Add this character to value
_strElem.push_back(*_pcSrc++);
// Parse unquoted value
while (*_pcSrc != '\0' && *_pcSrc != ',')
_strElem.push_back(*_pcSrc++);
// Advance to next character (if not already end of string)
if (*_pcSrc != '\0')
/// Add this string to container
_ltStr.push_back(_strElem);
/// 分析后的一行文件内容所得的元素列表添加到容器中
vlStr.push_back(_ltStr);
/// 归零,防止下次分析旧的数据。
_strIn.assign(&&);
return XC_ERR_NONE;
const int CXCFileStream::WriteCsvData(LPCTSTR lpszFilename, const vector&list&string& & &vlStr)
/// 1、判断是否是CSV文件
if (! IsCsvFile(lpszFilename))
return XC_ERR_INVALID_FILE_NAME;
/// 2、打开CSV文件
ofstream _streamToFile(lpszFilename);
///&&& 判断打开文件是否成功
if (NULL == _streamToFile)
return (-errno);
/// 本地变量
static TCHAR chQuote = '&';
static TCHAR chComma = ',';
/// Loop through each list of string in vector
for (vector&list&string& &::const_iterator vIt = vlStr.begin(); vIt != vlStr.end(); vIt ++) {
/// Loop through each string in list
for (list&string&::const_iterator lIt = vIt-&begin(); lIt != vIt-&end(); lIt ++) {
/// Separate this value from previous
if (vIt-&begin() != lIt)
_streamToFile.put(chComma);
/// 考虑string中可能有,或&的情况,这就要特殊包装。
bool bComma = (lIt-&find(chComma) != lIt-&npos);
bool bQuote = (lIt-&find(chQuote) != lIt-&npos);
/// 真的含有,或&的情况
if (bComma || bQuote) {
_streamToFile.put(chQuote);
if (bQuote) {
for (string::const_iterator chIt = lIt-&begin(); chIt != lIt-&end(); chIt ++ ) {
// Pairs of quotes interpreted as single quote
if (chQuote == *chIt)
_streamToFile.put(chQuote);
_streamToFile.put(*chIt);
_streamToFile && *lIt;
_streamToFile.put(chQuote);
_streamToFile && *lIt;
_streamToFile &&
return XC_ERR_NONE;
如果朋友你有更好的建议或这里有问题,请根据blog抬头我的联系方式跟我取得联系,感谢你的支持和帮助。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。C++文件读写详解(ofstream,ifstream,fstream) - 晨雪无痕
- 博客频道 - CSDN.NET
69439人阅读
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结:
这里主要是讨论fstream的内容:
#include &fstream&
//文件写操作 内存写入存储设备
//文件读操作,存储设备读区到内存中
//读写操作,对打开的文件可进行读写操作
1.打开文件
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作
函数:open()
参数: filename&& 操作文件名
&&&&&&&&&& mode&&&&&&& 打开文件的方式
&&&&&&&&&& prot&&&&&&&& 打开文件的属性&&&&&&&&&&&&&&&&&&&&&&&&&&& //基本很少用到,在查看资料时,发现有两种方式
打开文件的方式在ios类(所以流式I/O的基类)中定义,有如下几种方式:
为输入(读)而打开文件
为输出(写)而打开文件
初始位置:文件尾
所有输出附加在文件末尾
ios::trunc
如果文件已存在则先删除该文件
ios::binary
二进制方式
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如
out.open(&Hello.txt&, ios::in|ios::out|ios::binary)
//根据自己需要进行适当的选取打开文件的属性同样在ios类中也有定义:
普通文件,打开操作
对于文件的属性也可以使用“或”运算和“+”进行组合使用,这里就不做说明了。
很多程序中,可能会碰到ofstream out(&Hello.txt&), ifstream in(&...&),fstream foi(&...&)这样的的使用,并没有显式的去调用open()函数就进行文件的操作,直接调用了其默认的打开方式,因为在stream类的构造函数中调用了open()函数,并拥有同样的构造函数,所以在这里可以直接使用流对象进行文件的操作,默认方式如下:
当使用默认方式进行对文件的操作时,你可以使用成员函数is_open()对文件是否打开进行验证
2.关闭文件
当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。
3.文本文件的读写
类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。
一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符&&:
// writing on a text file
#include &fiostream.h&
int main () {
ofstream out(&out.txt&);
if (out.is_open())
out && &This is a line.\n&;
out && &This is another line.\n&;
out.close();
//结果: 在out.txt中写入:
This is a line.
This is another line
从文件中读入数据也可以用与 cin&&的使用同样的方法:
// reading a text file
#include &iostream.h&
#include &fstream.h&
#include &stdlib.h&
int main () {
char buffer[256];
ifstream in(&test.txt&);
if (! in.is_open())
{ cout && &Error opening file&; exit (1); }
while (!in.eof() )
in.getline (buffer,100);
cout && buffer &&
//结果 在屏幕上输出
This is a line.
This is another line
上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。注意我们使用了一个新的成员函数叫做eof ,它是ifstream 从类 ios 中继承过来的,当到达文件末尾时返回true 。
状态标志符的验证(Verification of state flags)
除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值):
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
如果读文件到达文件末尾,返回true。
这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。
获得和设置流指针(get and put stream pointers)
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。fstream, 类似 iostream, 同时继承了get 和 put
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
从流开始位置计算的位移
从流指针当前位置开始计算的位移
从流末尾处开始计算的位移
流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。
以下例子使用这些函数来获得一个二进制文件的大小:
// obtaining file size
#include &iostream.h&
#include &fstream.h&
const char * filename = &test.txt&;
int main () {
ifstream in(filename, ios::in|ios::binary);
l = in.tellg();
in.seekg (0, ios::end);
m = in.tellg();
in.close();
cout && &size of & &&
cout && & is & && (m-l) && & bytes.\n&;
size of example.txt is 40 bytes.
4.二进制文件
在二进制文件中,使用&& 和&&,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:
write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
// reading binary file
#include &iostream&
#include &fstream.h&
const char * filename = &test.txt&;
int main () {
ifstream in (filename, ios::in|ios::binary|ios::ate);
size = in.tellg();
in.seekg (0, ios::beg);
buffer = new char [size];
in.read (buffer, size);
in.close();
cout && &the complete file is in a buffer&;
//运行结果:
The complete file is in a buffer
5.缓存和同步(Buffers and Synchronization)
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:
当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:110952次
排名:千里之外
原创:18篇
转载:14篇
评论:31条
(3)(4)(2)(1)(1)(2)(3)(4)(1)(2)(2)(3)(1)(1)(2)(1)(1)汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1811)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'1208学习笔记(C++文件写入)',
blogAbstract:'&& 和C语言不同,C++对文件的操作有自己的方法。&&&&&&& C++对文件的操作主要是通过两个类(ofstream---向文件中写入数据。ifstream----从文件中读取数据),通过指定类中的变量取值来达到对文件的操作。&&&&&& ofstream类的构造函数(有好几个,这个用的最多)ofstream::ofstream \r\n\r\n\r\nofstream( const char* szName, int nMode = ios::out, int nProt =',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 c语言写入txt文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信