在C中拆分文本文件并为其命名

时间:2016-04-25 05:20:46

标签: c file text printing split

我创建了一个代码,用于在文本文件找到单词" NEW DAY"然后使用特定名称保存文件。

首先,我使用File_Part1,File_Part2等等......但是,我想使用我正在阅读的文件第二行的前15个字符作为保存文件的名称。

例如,第二行写着: TAM 2000-03-07T14:53 ... 我只想使用 TAM 2000-03-07

问题在于sprintf函数适用于"%d","%c"但不适用于"%s"而且我不知道为什么。

我试图在之前打印变量,看看sprintf应该接收什么,它正在接收我想要的......

以下是代码:

int TAM_BUFFER = 75; 
int filecounter=1, linecounter=1;

char fileoutputname[16];

int main(int argc, char *argv[]){

char buffer[TAM_BUFFER];
char buffer2[15];


FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;

sprintf(fileoutputname, "file_part%d.txt", filecounter);
saida = fopen(fileoutputname, "w");

if(arquivo != NULL){

    while(fgets(buffer, TAM_BUFFER, arquivo)){

        if(linecounter==2){
        strncpy(buffer2,buffer,14);
    }

    if (strncmp(buffer,"NEWDAY",strlen("NEWDAY")) == 0){
        fclose(saida);
        linecounter = 1;
        filecounter++;
        printf("%s", buffer2);
        sprintf(fileoutputname,"%s", buffer2);
        saida = fopen(fileoutputname, "w");
        if (!saida)
            return 1;       
    }

    fprintf(saida,"%s\n", buffer);
    linecounter++;

    }

} 

fclose(saida);
return 0;

}

1 个答案:

答案 0 :(得分:1)

如果源的长度超过您复制的字符数,strncpy函数将不会添加字符串终止符,因此buffer2可能不包含字符串终止符,并且当您将其视为已终止时字符串,你将有未定义的行为

解决方案非常简单:手动添加终结器。

strncpy(buffer2,buffer,sizeof buffer2 - 1);
buffer2[sizeof buffer2 - 1] = '\0';