g*****u 发帖数: 298 | |
g*****u 发帖数: 298 | 2 就是要求写程序求一个文件的字符的平均值
unsigned char average(const char *filename)。
我能想到的地方有
文件不存在或者权限不对
计数器溢出(大文件,各种操作系统文件大小有何不同)
应该用什么数据类型和算法,用long double够不够。。。
请问还有什么别的考虑? |
t****t 发帖数: 6806 | 3 考虑得差不多了.
【在 g*****u 的大作中提到】 : 就是要求写程序求一个文件的字符的平均值 : unsigned char average(const char *filename)。 : 我能想到的地方有 : 文件不存在或者权限不对 : 计数器溢出(大文件,各种操作系统文件大小有何不同) : 应该用什么数据类型和算法,用long double够不够。。。 : 请问还有什么别的考虑?
|
f*****Q 发帖数: 1912 | 4 读到一半硬盘坏了, heyhey...
【在 g*****u 的大作中提到】 : 就是要求写程序求一个文件的字符的平均值 : unsigned char average(const char *filename)。 : 我能想到的地方有 : 文件不存在或者权限不对 : 计数器溢出(大文件,各种操作系统文件大小有何不同) : 应该用什么数据类型和算法,用long double够不够。。。 : 请问还有什么别的考虑?
|
g*****u 发帖数: 298 | 5 如果中间某些扇区坏了这个应该怎么处理?是不是应该在开始的时候得到文件大小,如
果还没读到结尾就读不了了,把当前读了多少和文件大小比较,如果发现还没到末尾就
返回错误代码? 比如下面
ifstream fin( "temp.txt" );
unsigned long long num_bytes = 0;
while( fin.good() )
{
fin.get(ch);
num_bytes++;
.....
}
if ( num_bytes < file_length)
return -1;
如果中间某些扇区坏了那么good()应该返回0吧?我还没有实验过这种情况,不知道对
不对。
:读到一半硬盘坏了, heyhey... |
t****t 发帖数: 6806 | 6 不用考虑这个
【在 g*****u 的大作中提到】 : 如果中间某些扇区坏了这个应该怎么处理?是不是应该在开始的时候得到文件大小,如 : 果还没读到结尾就读不了了,把当前读了多少和文件大小比较,如果发现还没到末尾就 : 返回错误代码? 比如下面 : ifstream fin( "temp.txt" ); : unsigned long long num_bytes = 0; : while( fin.good() ) : { : fin.get(ch); : num_bytes++; : .....
|
g*****u 发帖数: 298 | 7 thrust大侠能不能post个标准答案看看?
【在 t****t 的大作中提到】 : 考虑得差不多了.
|
g*****u 发帖数: 298 | 8 有个问题:C++标准里有没有肯定有64位的整型?似乎没有。long long或_int64不
是标准里的。那么这道题里面byte的计数器可以用double么?
还有,就算用unsigned long long来计数,如果文件大于2^64-1怎么办? |
l***8 发帖数: 149 | 9 >> 如果文件大于2^64-1怎么办?
LOL you mean file size > 16,000,000 TB??? That is an expensive hard disk you have. |
k**f 发帖数: 372 | 10
Right now I doubt there's any single file with size greater than 2^64 > 1.
84e19.
double has precision of 53 bits, so it can only precisely represent a
counter up to 2^53-1. Beyond that, the counter is no longer accurate to the
bytes.
That said, you may want to use fpos_t for the type of the file size counter,
the compiler should define a proper type suitable for the underlying
operating system.
【在 g*****u 的大作中提到】 : 有个问题:C++标准里有没有肯定有64位的整型?似乎没有。long long或_int64不 : 是标准里的。那么这道题里面byte的计数器可以用double么? : 还有,就算用unsigned long long来计数,如果文件大于2^64-1怎么办?
|
g*****u 发帖数: 298 | 11 fpos_t似乎不能作为计数器,它只是给fsetpos()用的,不能用作加减乘除吧?
几个问题:
1. typedef __int64 fpos_t;
__int64 是C standard type么?
2. 当文件超过2GB时(在linux一般文件大小限制),get(),fread()等C库函数能正常
工作么?
3. 如果我想得到一个文件的大小,但是ftell()返回类型为long,这对大文件是不够
的。大文件在linux下需要LFS支持,我应该用哪些函数来得到文件大小?不同操作系统有不同的库吧?windows和linux,unix都分别应该怎么做?
btw,double的53bits是尾数,11bit的指数部分决定double能表示的最大的数字为差不
多2^(2^10-1),大约是10^308,对于一般文件是够用了。问题是我不清楚上面的问题2,
3。那个大侠最好能发个答案,多谢了。 |