【问题标题】:Split a text file in C and give it a name在 C 中拆分文本文件并为其命名
【发布时间】:2016-04-25 05:20:45
【问题描述】:

我创建了一个代码来在找到单词“NEW DAY”时拆分文本文件,然后使用特定名称保存文件。

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

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

问题是函数 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;

}

【问题讨论】:

  • saidaNULL 时添加perror();。这可能会显示一个有趣的错误消息。
  • 您还应该在main() 的末尾加上fclose(arquivo)。 (这不能解决您的问题,但您应该始终关闭文件)。
  • 你好@jdarthenay,谢谢你的建议,我真的忘了关闭(arquivo)。关于 perror(),好吧,它说“没有错误”。所以我觉得还可以。
  • printf("%s", buffer2); 用于调试?你能把它换成printf("strlen(%s)=%d\n", buffer2, (int) strlen(buffer2));吗?
  • 对不起@jdarthenay 我还没有看到你的评论。结果是 strlen=14

标签: c file text printing split


【解决方案1】:

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

解决方法很简单:手动添加终结符。

喜欢

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

【讨论】:

  • 你好 Joachim,这是可能的,但我不知道为什么,但它无法识别我在键盘上输入的字符。我的意思是,它没有用,所以我尝试在 buffer2[10] 处添加“N”,但它没有添加,而是在“N”应该是的数字之间添加了一个空格“”。我想当我添加 '\0' 时也会发生这种情况......
  • 如果我使用 sprintf(fileoutputname, "%c.txt", *buffer2);它将与第二行的第一个字母一起保存,我的意思是字母“T”但是如果我更改为 sprintf(fileoutputname, "%s.txt", *buffer2);它只是使应用程序崩溃...
  • 我明白,我不知道为什么它适用于 %C,但没关系。问题是,如果 buffer2 是一个可以用 "%s" 打印的字符串,为什么不能用它来命名文件: printf("%s", buffer2); sprintf(fileoutputname, "%s.txt", buffer2);
  • @user3054811 当你取消引用一个指针时,你会得到它指向的值。在您的示例中,*buffer2buffer2[0] 相同。它是一个字符"%c" 格式需要一个字符。 "%s" 格式需要一个指向字符串的 指针,以零结尾(不是字符 '0',而是实际的零,例如 0'\0')。
  • 好的,Joachim,感谢您的帮助。现在我明白了,真的谢谢你。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 2013-07-23
  • 2013-09-19
  • 2016-04-29
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多