修正了一点BUG,再贴一次:
程序代码:
/*----------------------------
程序说明: 将指定文本文件按行分割为若干份
使用格式: 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;
}