那就是你说的那样了。你执行一下看,最后一行有没有丢失,一行文字打到中间给它一个EOF。
授人以渔,不授人以鱼。
/*---------------------------- 程序说明: 将指定文本文件按行分割为若干份 使用格式: test_File <文件名> /n:<分割数> ----------------------------*/ #include <stdlib.h> #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { if (argc < 3) { printf_s("格式: %s <filename> /n:<n>\n", argv[0]); return -1; } int number = 0; // 分割文件数 sscanf_s(strchr(argv[2], ':') + 1, "%d", &number); if (number == 0) { printf_s("参数%s格式不正确\n", argv[2]); return -2; } FILE** out; out = new FILE*[number]; if (!out) { printf_s("内存分配失败\n"); return -3; } // 打开输入文件 FILE* in; errno_t error = fopen_s(&in, argv[1], "rb"); if (error != 0) { printf_s("文件%s打开错误\n", argv[1]); return error; } // 建立输出文件 for (int index = 0; index < number; ++index) { char buffer[5]; // 假定分割数不超过4位数 _itoa_s(number, buffer, sizeof(buffer), 10); size_t length = strlen(argv[1]) + _countof(buffer); char* filename = new char[length]; if (filename) { sprintf_s(filename, length, "%s.%d", argv[1], index + 1); errno_t error = fopen_s(&out[index], filename, "wb"); if (error != 0) { printf_s("文件%s建立错误\n", filename); return error; } delete[] filename; } } // 分割文件操作 // 机制:若是文本文件,每行必定以0D0A结束,则遇到0A才递增行号 size_t line_no = 0; // 行号 while (!feof(in)) { if (fputc(fgetc(in), out[line_no % number]) == 0x0A) { ++line_no; } } // 关闭打开的文件 for (int index = 0; index < number; ++index) { fclose(out[index]); } delete[] out; fclose(in); printf_s("文件%s分割完成\n", argv[1]); return 0; }
while (!feof(file)) { char buffer[1024]; if (fgets(buffer, sizeof(buffer) - 1, file) != NULL) { struct RECORD record; char* pStart = strchr(buffer, '\"') + 1; char* pEnd = strrchr(buffer, '\"'); strncpy_s(record.name, pStart, pEnd - pStart); record.name[pStart, pEnd - pStart] = '\0'; if (sscanf_s(pEnd + 1, "%d %d %d", &record.integral, &record.goal_difference, &record.goals) < 3) { error = -1; printf_s("数据文件记录错误: Line %d\n", theRecords.size() + 1); break; } theRecords.push_back(record); } }读的数据如下:
"China" 2 1 5 "U.S.A." 12 2 7 "U.K." 12 4 10 "Japan" 4 2 3 "France" 4 2 4 "Germany" 10 3 8