C++ I/O 问题
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <windows.h>
int main()
{
ofstream creat("test.txt"); // 创建一个test.tst文件供测试
if( !creat )
{
cout<<"HDD not ready to test!";
return 0;
}
cout << "successful" <<endl;
char *str = new char[1024];
memset(str,49,1024);//内容全为字符 '1'
creat.write(str, 1024);// 生成一个1kB的test.tst文件内容全部为字符 '1'
creat.close();
ifstream in("test.txt");
DWORD dwTest;
DWORD dwCountEnd;
in.seekg(0,ios::beg);
int count = 0 ;
int count2 = 0 ;
char content;
DWORD dwStart = GetTickCount();
DWORD dwEnd = ( dwStart + 500);
while ( ( dwTest = GetTickCount() ) <= dwEnd ) //使程序运行时间控制在0。5秒以内
{
//in.read( str, 1 );
content = in.get(); //想显示读的字符‘1’,可惜不成功!--问题1
cout << content <<endl;
count2 ++;
cout << count2<<endl;
if ( in.eof() )
{
count++;
in.seekg(0,ios::beg); //想使读指针回到文件头,再从头读起,但是不成功好像只
//有第一次是从头读起,以后就是一直在eof那里
// 问题2
dwCountEnd = GetTickCount();
}
}
in.close();
cout << " dwStart: " << dwStart << endl;
cout << " dwTest: " << dwTest << endl;
cout << " dwEnd: " << dwEnd << endl;
cout << " dwCountEnd: " << dwCountEnd <<endl;
cout << " count: " << count << endl; //显示程序多少次读到文件尾,结果从第一次读到
//文件尾后就赖在文件尾那里不走了。
system ("Pause");
return 1;
}
想法是先创建一个写满1的大小为1kB文件,再一个字符一个字符的读,读的时间控制在大约0.5秒以内。在0.5秒以内的时候如果读到文件尾就再从头读起。
问题1:我如何显示读的内容,就是字符'1',老是显示不成功。
问题2:我如何在第一次读到文件尾的时候,让程序乖乖的再从头读起呢?
问题点数:100、回复次数:9Top
1 楼shenmea00000(学习中~~~)回复于 2006-03-25 15:39:43 得分 0
不明白~~~~~Top
2 楼fangrk(加把油,伙计!)回复于 2006-03-25 16:00:23 得分 30
试试看这样行不行:
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main()
{
ofstream creat("test.txt"); // 创建一个test.tst文件供测试
if( !creat )
{
cout<<"HDD not ready to test!";
return 0;
}
cout << "successful" <<endl;
for(int i=0;i<1024;++i) create<<'1';
creat.close();
ifstream in("test.txt");
DWORD dwTest;
DWORD dwCountEnd;
in.seekg(0,ios::beg);
int count = 0 ;
int count2 = 0 ;
char content;
DWORD dwStart = GetTickCount();
DWORD dwEnd = ( dwStart + 500);
while ( ( dwTest = GetTickCount() ) <= dwEnd ) //使程序运行时间控制在0。5秒以内
{
//in.read( str, 1 );
content = in.get(); //想显示读的字符‘1’,可惜不成功!--问题1
cout << content <<endl;
count2 ++;
cout << count2<<endl;
if ( in.eof() )
{
count++;
in.clear();
in.seekg(0,ios::beg); //想使读指针回到文件头,再从头读起,但是不成功好像只
//有第一次是从头读起,以后就是一直在eof那里
// 问题2
dwCountEnd = GetTickCount();
}
}
in.close();
cout << " dwStart: " << dwStart << endl;
cout << " dwTest: " << dwTest << endl;
cout << " dwEnd: " << dwEnd << endl;
cout << " dwCountEnd: " << dwCountEnd <<endl;
cout << " count: " << count << endl; //显示程序多少次读到文件尾,结果从第一次读到
//文件尾后就赖在文件尾那里不走了。
system ("Pause");
return 1;
}Top
3 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-03-25 16:09:40 得分 10
1: creat.close();
creat.clear();Top
4 楼gold123d(Love linux Love shell)回复于 2006-03-25 17:54:16 得分 0
" for(int i=0;i<1024;++i) create<<'1'"
这一行中的"create"应该是"creat".Top
5 楼ricky460(阿酷)回复于 2006-03-25 19:30:57 得分 30
问题一:
content = in.get(); //想显示读的字符‘1’,可惜不成功!--问题1
改成
in >> content ;
问题二:
在
in.seekg(0,ios::beg); //想使读指针回到文件头,再从头读起,但是不成功好像只
//有第一次是从头读起,以后就是一直在eof那里
// 问题2
前面加上:
in.clear();Top
6 楼ugg(逸学堂(exuetang.net))回复于 2006-03-25 20:51:17 得分 20
问题1:我如何显示读的内容,就是字符'1',老是显示不成功。
考虑用sstingstream读取内容。
问题2:我如何在第一次读到文件尾的时候,让程序乖乖的再从头读起呢?
文件指针的移位,主要用于二进制操作。楼主用在字符操作中,结果不可预料。Top
7 楼humanzhang()回复于 2006-03-25 22:55:43 得分 0
ugg
你说的太对了 我改成了生成2进制的了 多谢大家指教!!!Top
8 楼humanzhang()回复于 2006-03-25 23:33:43 得分 0
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <windows.h>
int main()
{
ofstream creat("test.bin",ios::out|ios::binary); // 创建一个test.tst文件供测试
if( !creat )
{
cout<<"HDD not ready to test!";
return 0;
}
cout << "successful" <<endl;
char *str = new char[1024];//1048576
memset(str,49,1024);//内容全为字符 '1'
creat.write(str,1024);// 生成一个1kB的test.tst文件内容全部为字符 '1'
creat.close();
creat.clear();
ifstream in("test.bin",ios::in|ios::binary);
DWORD dwTest;
DWORD dwCountEnd;
in.clear();
in.seekg(0,ios::beg);
DWORD dwStart = GetTickCount();
DWORD dwEnd = ( dwStart + 1000);
while ( ( GetTickCount() ) <= dwEnd ) //使程序运行时间控制在0。5秒以内
{
in.get();
if ( in.eof() )
{
count++;
in.clear();
in.seekg(0,ios::beg); //想使读指针回到文件头
}
}
in.close();
cout << " dwStart: " << dwStart << endl;
cout << " dwEnd: " << dwEnd << endl;
cout << " count: " << count << endl;
system ("Pause");
return 1;
}
程序运行的结果是 count 的值是 13115 左右; 也就是说在大约1000毫秒的时间里面,我一个字符一个字符读一个1kb的文件读了13115次, 也就是差不多12.8M/s, 大家说这样的速度时不是有点慢得不正常,我主要目的是测试读硬盘的速度,应该在那里改进为好呢!Top
9 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-03-26 09:11:26 得分 10
正常,好像用C的fwrite,fprintf等函数效率会高一点,前几天刚做过实验。12.8*8=102.4,磁盘速度差不多是100Mbps了。Top




