我正在尝试创建一个C程序,该程序有一个50行的text.txt文件。该text.txt文件应分为5个文件,如text_part1.txt、text_part2.txt等。text.txt文件中的50行应平均复制到5个文件中的10行。
所有这些都必须通过使用命令行参数来完成。我是C语言的初学者,刚刚开始编写代码。我不知道如何使用命令行参数。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *ptr_readfile;
FILE *ptr_writefile;
char line [100];
char fileoutputname[10];
int filecounter=1, linecounter=1;
ptr_readfile = fopen("C:/home/dir/sample_pg/data/text.txt","r");
if (!ptr_readfile)
return 1;
sprintf(fileoutputname, "file_part%d", filecounter);
ptr_writefile = fopen(fileoutputname, "w");
while (fgets(line, sizeof line, ptr_readfile)!=NULL)
{
if (linecounter == 5)
{
fclose(ptr_writefile);
linecounter = 1;
filecounter++;
sprintf(fileoutputname, "file_part%d", filecounter);
ptr_writefile = fopen(fileoutputname, "w");
if (!ptr_writefile)
return 1;
}
fprintf(ptr_writefile,"%sn", line);
linecounter++;
}
fclose(ptr_readfile);
return 0;
}
要获得程序的参数,您需要定义具有参数计数(通常称为argc
)和参数数组(通常命名为argv
)的main
函数,因此
int main(int argc, char**argv) {
for (int ix=1; ix<argc; ix++) {
FILE* fil = fopen(argv[ix], "r");
if (!fil) { perror(argv[ix]); exit(EXIT_FAILURE); };
当你把这个(和一些其他需要的代码)编译成一个可执行的foo.exe
并在终端上运行foo.exe a b c
时,argc
是4,你就有了
argc == 4 &&
strcmp(argv[0], "foo.exe") == 0 &&
strcmp(argv[1], "a") == 0 &&
strcmp(argv[2], "b") == 0 &&
strcmp(argv[3], "c") == 0 &&
argv[4] == NULL
注意,在fopen
这样的函数失败时调用perror
是一个好习惯
顺便说一句,你忘了在你的程序中调用fclose
。您还可以了解更多关于fflush
的信息。您应该更喜欢snprintf
而不是sprintf
,以避免缓冲区溢出。了解更多关于未定义行为的信息,并对其感到非常害怕。
请养成编译所有警告的习惯&调试信息(例如gcc -Wall -Wextra -g
,如果使用GCC…),然后学习如何使用调试器。
阅读perror(3)、fopen(3。
另请参阅csplit;您可能会从研究在Linux上实现它的免费软件包coreutils的源代码中获得一些灵感。