在文本模式下讀取文件時,換行符可能被轉換為兩個字符(CR+LF),導致 ftell 返回的文件長度與實際字符數不一致。若需準確獲取字符個數,需採用適當策略。
fseek/ftell 並一次性讀取適用於已知文件不大、可一次性載入內存的場景。
FILE *pFile = fopen(pFilePath, "r");
if (pFile == NULL) return 0;
fseek(pFile, 0, SEEK_END);
long iFileLen = ftell(pFile);
rewind(pFile);
char *m_pFileText = new char[iFileLen + 1];
fread(m_pFileText, 1, iFileLen, pFile);
m_pFileText[iFileLen] = '\0';
fclose(pFile);
注意:此法獲取的是文件位元組長度,在文本模式下 Windows 上可能包含 \r\n 兩字節,實際字符數會略少。
逐個讀取字符直到 EOF,直接統計字符數量,不受換行符轉換影響。
FILE *pFile = fopen(pFilePath, "r");
if (!pFile) return 0;
int num = 0;
int ch;
while ((ch = getc(pFile)) != EOF) {
num++;
}
fclose(pFile);
// num 即為字符個數
"rb")下兩者結果一致。