关于数据文本文件的读、写的几个小问题

ratrat 2001-11-07 09:21:48
路过的朋友,你们好!
为了更好的表达清楚我的意思,我先把我想要做的事说一下(如果你有其他方法
而完成同样功能,我一样谢谢你,并给分)(最好把步骤写清楚些,非常感谢)

(1)假设我有这样一个纯文本整数型数据文件,其格式如下:
78 92 104 25 51 //注:先考虑只有五个数的简单情况
这个文件保存在 D:\tem\my\array2.txt 中。
我的目的是读入这5个整数型数据到数组array[5]中,数据处理后,再写到D:\tem\my\array2.txt 中。

(2) 假设源文件中有1000个整数型数据(或更多),该怎么办? // 共1000行
读入一行数据处理后,依次读入下一行数据
(3)若不知源文件中数据个数,(只知数据很多,),又该怎么办?

...全文
184 点赞 收藏 23
写回复
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ratrat 2001-11-08
ok
回复
ratrat 2001-11-07
to xddjd() :没晚,谢谢你!我再开贴子,你进入后,我即加分。贴子同样的题目
回复
xddjd 2001-11-07
来晚了!!!!
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

void main()
{
ifstream read_file("c:\\xuexi\\test.cpp");

if(!read_file)
{
cerr<<"can not find this file\n";
return;
}
int readwords;
vector<int> text_file;
while(read_file >> readwords)
{
text_file.push_back(readwords);
}

ofstream end_file("c:\\xuexi\\test.cpp");
if(!end_file)
{
cerr<<"can not write this file\n";
return;
}

for(int jn=0;jn<text_file.size();jn++)
end_file<<(text_file[jn]+10)<<endl;
cout << "modify successly"<<endl;
}
回复
ratrat 2001-11-07
代码在那里?
回复
SlaSk 2001-11-07
ratrat():what ?
回复
ratrat 2001-11-07
where?
回复
SlaSk 2001-11-07
用c不好解决阿。。。
用asp可以吗???
我很早很早以前的代码应该还在。。
回复
shornmao 2001-11-07
对不起,是我没有看清楚他的原题,他说的是:
读完一行处理后,再读下一行。
我投降了!
主要是没有想到他提的是这么简单的问题,我用膝盖思考都足够了。
回复
shornmao 2001-11-07
我不是已经说明了吗?你怎么没有看懂呢?
如果数据处理涉及多行数据之间,就必须一次读入多行!
你的算法在数据处理只涉及单行的情况下,是很完美的。
但是注意他的原题,他并没有确切的指出时进行何种数据处理。
回复
SFirefox 2001-11-07
如果把各个整数都用定长存储,可以用“R+”方式修改后覆盖。
回复
lurenfu 2001-11-07
我没有研究过STL,不要问我这个
回复
lurenfu 2001-11-07
死猫错矣,首先,不用先读入全部数据,其次读取文件行数很好实现。你可以先读部分数据,处理完了再读,真到文件尾,上面的while( !feof(fp) )就可以。如果你要得到文件行数,你可以这样做:
FILE *fp;
int lineno = 0;
fp = fopen( filename, "r" );
while( !feof(fp) )
{
char buf[1024]; //假定一行不超过1024字节,如果超过,请看下面解决办法
fgets( buf, sizeof(buf), fp );
  lineno++;
}
fclose(fp);
如果你不能确定一行是否超过1024字节。你加入以下判断
while( !feof(fp) )
{
char buf[1024];
int len;
fgets( buf, 1024, fp );
len = strlen( buf );
if ( buf[len-1] == '\n' )
{
lineno++;
}
}
一切搞定
回复
flybird70 2001-11-07
绝不食言
用的是C++的STL,又怎样改?
回复
lurenfu 2001-11-07
上面最后还要加一行:
unlink( "D:\\TEM\\MY\\AYYAR2.TXT" );
rename( "D:\\TEM\\MY\\ARRAY2.TXT", "D:\\TEM\\MY\\ARRAY2.TXT" );
回复
shornmao 2001-11-07
给你一个C++/STL的提示:
使用istream_iterator和ostream_oterator,数据存储用vector。
如果用C的方法,楼上的说得没错,可是如果不知道文件有多长,就只能用每次只处理一行数据,如果数据处理设计多行,就必须先取得文件的行数(我不知道如何实现),然后用malloc动态分配一个足够大的二维属组,再把数据按照他的方法读入数组中,但是循环中必须增加数组行数递增的代码。
回复
lurenfu 2001-11-07
你要想操作数据后再写回文件,建议你先写到一个临时文件中,处理完所有数据后再将临时文件改名为arra2.txt,你的明白?

FILE *fp = NULL, *tfp = NULL;
int array[5];
fp = fopen( "D:\\TEM\\MY\\ARRAY2.TXT", "r" );
tfp = fopen( "D:\\TEM\\MY\\TMP.TXT", "w" );
if ( !fp || !tfp ) //error;
while( !feof(fp) )
{
fscanf( fp, "%d %d %d %d %d", array, array+1, array+2, array+3, array+4 );
//here,处理你的array中的数据
fprintf( tfp, "%d %d %d %d %d\n", array[0], array[1], array[2], array[3], array[4] );
}
fclose( fp );
fclose( tfp );
回复
lurenfu 2001-11-07
即使你不知道数据有多少,比如你不知道有1000行,也可以像上面处理,你快试吧,成功了加分,不许食言
回复
lurenfu 2001-11-07
如果你知道每行五个整数,很简单,如下即可:
FILE *fp = NULL;
int array[5];
fp = fopen( "D:\\TEM\\MY\\ARRAY2.TXT", "r" );
while( !feof(fp) )
{
fscanf( fp, "%d %d %d %d %d", array, array+1, array+2, array+3, array+4 );
//here,处理你的array中的数据
}
fclose( fp );
回复
flybird70 2001-11-07
用的是c++.
回复
SFirefox 2001-11-07
给你点提示,用“r+”方式打开的文件可以修改。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告