1. 文件和unicode的关系?
没关系,文件是文件,unicode是unicode编码。将文件想象成二进制数据,如果你存入文件时存入的是unicode字符(比如每字符是两字节的),
那么整个文件是unicode字符的二进制数据。反之,如果存入的是ASCII字符,那么整个文件就是ASCII字符组成的二进制。
读取也可以按照字符读取也可以按照二进制读取,
如果是按照字符读取,如果你知道文件里存取的都是unicode字符,如果你使用w版本的getc读取,应该是一个unicode字符(没试过)。否则你使用
普通getc读取字符,那么应该是一个ASCII字符(没试过).
如果是二进制读取的,fread(buf, sizeof(char), 15, pFile);一个字符一个字符的读取,哪怕是unicode字符,读取的都是二进制的数据。
unicode真正对文件操作有点影响的是,打开文件时,按照文件名是不是unicode的,可以有两个版本,
ASCII版本:
fopen("c://text.txt", "rb");
_wfopen(_T("c://text.txt", _T("rb")); //Windows unicode version.
2.fseek和ftell
fseek(pFile, 0, SEEK_SET);
long pos = ftell(pFile); // pos == 0
文件移动到了文件开头,并且ftell的值是0, 比如文件是3个字符的,如下显示
这个位置 a b c
|
那么可以将当前文件指针想象成在第一个字符之前的那个位置.
此时char buf[2] = {0};fread(buf, sizeof(char), 1, pFile);就读取了a字符.
3. 判断文件长度
fseek(pFile, 0, SEEK_SET);
fseek(pFile, 0, SEEK_END);
long nPos = ftell(pFile);
如果文件内容还是上面的3个字符,那么nPos = 3;也就是最后一个字符的位置。
4. 读写操作
读取:
fread(buf, sizeof(char), 15, pFile);返回值是读取的个数。如果内容是空的,那么返回0。如果想读15个字节,
但是文件内容是12个字节,那么就返回12..使用feof(pFile) != 0 && ferror(pFile) != 0来判断是否读到文件末尾,或者是否出错了,
出错了是否也要判断并且进行处理呢?我觉得没有必要。什么时候会出现错误呢?如果错误了后续的整个文件操作都失败了。
char buf[15] = {0};
while (feof(pFile) == 0)
{
size_t nCnt = fread(buf, sizeof(char), 15, pFile);
++nCnt;
}
写入:
size_t fwrite(
const void *buffer,
size_t size,
size_t count,
FILE *stream
);
fwrite比较简单,返回值表示写入的字节数,失败的时候写入的个数会比想写的个数少?(当磁盘满的时候会出现这种情况吗?)
没关系,文件是文件,unicode是unicode编码。将文件想象成二进制数据,如果你存入文件时存入的是unicode字符(比如每字符是两字节的),
那么整个文件是unicode字符的二进制数据。反之,如果存入的是ASCII字符,那么整个文件就是ASCII字符组成的二进制。
读取也可以按照字符读取也可以按照二进制读取,
如果是按照字符读取,如果你知道文件里存取的都是unicode字符,如果你使用w版本的getc读取,应该是一个unicode字符(没试过)。否则你使用
普通getc读取字符,那么应该是一个ASCII字符(没试过).
如果是二进制读取的,fread(buf, sizeof(char), 15, pFile);一个字符一个字符的读取,哪怕是unicode字符,读取的都是二进制的数据。
unicode真正对文件操作有点影响的是,打开文件时,按照文件名是不是unicode的,可以有两个版本,
ASCII版本:
fopen("c://text.txt", "rb");
_wfopen(_T("c://text.txt", _T("rb")); //Windows unicode version.
2.fseek和ftell
fseek(pFile, 0, SEEK_SET);
long pos = ftell(pFile); // pos == 0
文件移动到了文件开头,并且ftell的值是0, 比如文件是3个字符的,如下显示
这个位置 a b c
|
那么可以将当前文件指针想象成在第一个字符之前的那个位置.
此时char buf[2] = {0};fread(buf, sizeof(char), 1, pFile);就读取了a字符.
3. 判断文件长度
fseek(pFile, 0, SEEK_SET);
fseek(pFile, 0, SEEK_END);
long nPos = ftell(pFile);
如果文件内容还是上面的3个字符,那么nPos = 3;也就是最后一个字符的位置。
4. 读写操作
读取:
fread(buf, sizeof(char), 15, pFile);返回值是读取的个数。如果内容是空的,那么返回0。如果想读15个字节,
但是文件内容是12个字节,那么就返回12..使用feof(pFile) != 0 && ferror(pFile) != 0来判断是否读到文件末尾,或者是否出错了,
出错了是否也要判断并且进行处理呢?我觉得没有必要。什么时候会出现错误呢?如果错误了后续的整个文件操作都失败了。
char buf[15] = {0};
while (feof(pFile) == 0)
{
size_t nCnt = fread(buf, sizeof(char), 15, pFile);
++nCnt;
}
写入:
size_t fwrite(
const void *buffer,
size_t size,
size_t count,
FILE *stream
);
fwrite比较简单,返回值表示写入的字节数,失败的时候写入的个数会比想写的个数少?(当磁盘满的时候会出现这种情况吗?)