.dat 並非標準格式,而是「數據檔」的通用副檔名,實際內容可能是文本、二進位結構體、陣列序列化等。讀取前必須確認數據格式 (由寫入端定義)。本文示範最常見的「文本浮點數逐行/逐欄位」讀取模式。
bool ReadDatFile(const char* filename, double* buffer, int maxCount, int& actualCount) {
FILE* fp = fopen(filename, "r"); // 文本模式
if (!fp) return false;
actualCount = 0;
while (actualCount < maxCount) {
double val;
// %lf 讀取 double,自動跳過空白字元 (空格、換行、Tab)
if (fscanf(fp, "%lf", &val) != 1) break;
buffer[actualCount++] = val;
}
fclose(fp);
return true;
}
// 使用
double data[1000];
int count;
if (ReadDatFile("signal.dat", data, 1000, count)) {
// 成功讀取 count 個 double
}
bool ReadDatBinary(const char* filename, double* buffer, int maxCount, int& actualCount) {
FILE* fp = fopen(filename, "rb"); // 二進位模式 關鍵!
if (!fp) return false;
// 讀取整個陣列 (或分塊讀取)
size_t read = fread(buffer, sizeof(double), maxCount, fp);
actualCount = static_cast(read);
fclose(fp);
return true;
}
| 模式 | fopen 模式 | 讀取函數 | 適用場景 | 跨平台 |
|---|---|---|---|---|
| 文本 | "r" | fscanf, fgets+解析 | 人類可讀、CSV、日誌、ASCII 浮點數 | 良好 (注意換行符 CR/LF/CRLF) |
| 二進位 | "rb" | fread | 高效、結構體陣列、影像/聲音原始數據 | 需注意位序/對齊/浮點數標準 (IEEE 754) |
void ReadDatMFC(const CString& path, CArray& arr) {
CFile file;
if (!file.Open(path, CFile::modeRead | CFile::typeBinary)) return;
CArchive ar(&file, CArchive::load);
double val;
while (ar.Read(&val, sizeof(double)) == sizeof(double))
arr.Add(val);
ar.Close(); file.Close();
}
fscanf 失敗率高,改二進位。核心原則:沒有通用的 .dat 讀取器,只有針對特定格式的讀取代碼。