// Program 19.6 Reading and writing the primes file as binary
#include <fstream>
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
long nextprime(fstream& primes); // Find the prime after lastprime
void write(ostream& out, long value); // Write binary long value
void read(istream& in, long& value); // Read binary long value
int main()
{
try
{
const char* filename = "C:\\JunkData\\nuprimes.bin";
fstream primes; // Create file stream object
primes.open(filename, ios::in | ios::out | ios::binary); // Open the file
long count = 0; // Count of primes found
if(!primes)
{
primes.clear();
cout << endl << "File doesn't exist - creating..." << endl;
primes.open(filename, ios::out | ios::binary); // Create binary file
if(!primes)
throw ios::failure(string("Failed to create output file ") +
string(filename) +
string(" in main()"));
write(primes, 2); // Write 2 as binary long
write(primes, 3); // Write 3 as binary long
write(primes, 5); // Write 5 as binary long
write(primes, count = 3); // Write prime count
primes.close();
primes.open(filename, ios::in | ios::out | ios::binary);
}
long nprime = 0; // Sequence no. of prime required
long lastprime = 0; // Last prime found
for( ; ; )
{
cout << "Which prime (e.g. enter 15 for the 15th prime, zero to end)?: ";
cin >> nprime;
if(nprime <= 0) // Zero or negative?
return 0; // ...yes, so we are done
primes.seekg(-static_cast<int>(sizeof(long)), ios::end); // Go to start of last item
read(primes, count); // Read the last item
if(nprime <= count)
{
cout << endl << "Prime in file";
primes.seekg((nprime - 1) * sizeof(long), ios::beg); // Seek to position of nth
read(primes, lastprime); // ...and read it
}
else
while(count < nprime)
{
lastprime = nextprime(primes);
primes.seekp(-static_cast<int>(sizeof(long)), ios::end); // Move to the end
write(primes, lastprime); // Write prime as binary
write(primes, ++count); // Write prime as binary
}
cout << endl << "The "
<< nprime << ((nprime%10 == 1) && (nprime != 11) ? "st" :
(nprime%10 == 2) && (nprime != 12) ? "nd" :
(nprime%10 == 3) && (nprime != 13) ? "rd" : "th")
<< " prime is " << lastprime << endl;
}
cout << endl;
return 0;
}
catch(exception& ex)
{
cout << endl << typeid(ex).name() << ": " << ex.what() << endl;
return 1;
}
}
long nextprime(fstream& primes)
{
bool isprime = false; // Indicator that we have a prime
long aprime = 0; // Stores primes from the file
long candidate = 0; // Value to be tested
primes.seekg(-static_cast<int>(2 * sizeof(long)), ios::end); // Go to last prime in file
read(primes, candidate); // ...and read it
// Find the next prime
for( ; ; )
{
candidate += 2; // Next value for checking
long limit = sqrt(candidate); // Upper limit for divisors
primes.seekg(0, ios::beg); // Go to the start of the file
// Try dividing the candidate by all the primes up to limit
do
{
read(primes, aprime); // Read prime as binary
} while(aprime <= limit && (isprime = candidate % aprime > 0));
if(isprime) // We got one...
return candidate; // ...and return the prime
}
}
// Read a long value from a file as binary
void read(istream& in, long& value)
{
in.read(reinterpret_cast<char*>(&value), sizeof(value));
}
// Write a long value to a file as binary
void write(ostream& out, long value)
{
out.write(reinterpret_cast<char*>(&value), sizeof(value));
}
没有合适的资源?快使用搜索试试~ 我知道了~
c++入门经典源代码
共364个文件
cpp:259个
h:105个
需积分: 0 26 下载量 11 浏览量
2008-09-05
15:33:23
上传
评论
收藏 207KB ZIP 举报
温馨提示
c++入门经典源代码,呵呵,从网上下载的
资源详情
资源评论
资源推荐
收起资源包目录
c++入门经典源代码 (364个子文件)
prog19_06.cpp 5KB
prog9_08.cpp 5KB
prog19_05.cpp 5KB
prog7_09.cpp 4KB
prog19_03.cpp 4KB
prog13_04.cpp 3KB
prog13_03a.cpp 3KB
prog13_03.cpp 3KB
prog13_02.cpp 3KB
list.cpp 3KB
list.cpp 3KB
prog7_05.cpp 3KB
prog18_02.cpp 2KB
list.cpp 2KB
list.cpp 2KB
prog19_04.cpp 2KB
prog13_01.cpp 2KB
prog5_10.cpp 2KB
list.cpp 2KB
prog3_04.cpp 2KB
prog8_10.cpp 2KB
prog14_04.cpp 2KB
list.cpp 2KB
prog16_03.cpp 2KB
prog14_02.cpp 2KB
prog9_04b.cpp 2KB
prog6_01.cpp 2KB
prog16_04.cpp 2KB
prog5_08.cpp 2KB
prog14_06.cpp 2KB
prog16_10.cpp 2KB
list.cpp 2KB
prog16_02.cpp 2KB
prog20_02.cpp 2KB
prog7_08.cpp 2KB
prog16_09.cpp 2KB
prog10_06.cpp 2KB
prog6_08.cpp 2KB
prog11_01.cpp 2KB
prog20_13.cpp 1KB
prog5_02.cpp 1KB
prog19_09.cpp 1KB
prog17_02.cpp 1KB
prog12_01.cpp 1KB
prog19_01.cpp 1KB
prog8_09.cpp 1KB
prog14_05.cpp 1KB
prog18_04.cpp 1KB
prog9_01b.cpp 1KB
prog18_03.cpp 1KB
prog9_01a.cpp 1KB
prog2_01A.cpp 1KB
prog6_10.cpp 1KB
ErrorMessage.cpp 1KB
carton.cpp 1KB
prog19_08.cpp 1KB
prog14_01.cpp 1KB
prog20_11.cpp 1KB
Box.cpp 1KB
prog4_06.cpp 1KB
prog7_06.cpp 1KB
prog20_07.cpp 1KB
prog20_12.cpp 1KB
carton.cpp 1KB
prog9_04.cpp 1KB
prog9_04a.cpp 1KB
prog7_07.cpp 1KB
prog18_01.cpp 1KB
prog10_05.cpp 1KB
prog6_04.cpp 1KB
prog3_03.cpp 1KB
prog6_11.cpp 1KB
Box.cpp 1KB
prog7_03.cpp 1KB
prog9_01.cpp 1KB
box.cpp 1KB
box.cpp 1KB
box.cpp 1KB
prog5_11.cpp 1KB
prog20_01.cpp 1KB
prog16_05.cpp 1KB
prog12_06.cpp 1KB
prog7_04.cpp 1KB
prog3_07.cpp 1KB
prog2_01.cpp 1KB
prog5_09.cpp 1KB
prog2_06.cpp 1KB
prog4_04.cpp 1KB
prog9_06.cpp 1KB
prog4_08.cpp 1KB
prog17_05.cpp 1KB
Box.cpp 1024B
prog6_07.cpp 1018B
person.cpp 1016B
prog12_02.cpp 1006B
box.cpp 1002B
box.cpp 1002B
prog9_02a.cpp 988B
prog17_06.cpp 988B
prog6_05.cpp 974B
共 364 条
- 1
- 2
- 3
- 4
kingbeijixing
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0