【问题标题】:Have no clue how to fix a bug不知道如何修复错误
【发布时间】:2019-06-04 08:30:14
【问题描述】:

我正在使用 fscanf 扫描格式化的 .srt 文件,但是我遇到了一个无法解决的问题,因为我对 C 还很陌生。

我曾尝试逐个字符地读取文件,但它最终变得一团糟,我无法调试

if (input == NULL) 
    {
        printf("File doesn't exist, exiting!\n");
        exit(1);
    }
    printf("File opened!\n");

    int order; //number of line

    int csh; //hh
    int csm; //mm
    int css; //ss
    int csms; //ms

    int ceh; // same order as above
    int cem;
    int ces;
    int cems;

    char* text = calloc(256, sizeof(char));
    char c;

    int count = 0;
    while ((i = fscanf(input, "%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%10s", &order, &csh, &csm, &css, &csms, &ceh, &cem, &ces, &cems, text) > 0) )
    {
        count++;
        printf("%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%s",  order,  csh, csm, css,  csms,  ceh,  cem,  ces,  cems, text);

if (count == 2) 
        {
            int xyx;
            scanf_s("%d", &xyx);
        }




    }

所以我正在尝试读取格式化文件并将数据存储在双向链表中,文件看起来像这样

等等。文件很大,我相信 Phantom Menace 的整个字幕,所以我有两个问题,我的代码在完成时没有读取整个文本,其次,它没有超过我使用的 2 的计数器只是为了测试程序。

我得到这个输出

【问题讨论】:

  • 在尝试读取巨大的字幕文件之前,您应该尝试解析为您制作的示例数据,例如只有两行文本。请注意,%10s 语法将在文本中找到空格后立即停止阅读文本。您应该阅读 sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html 以了解有关 scanf 函数系列的更多信息
  • 将文本发布为 text 比将文本作为图片发布更有用。
  • OT:一般来说,最好遵守打印页面的右边距。 (通常为 72 或 80 个字符)通过在 fscanf() 函数和 printf() 函数的参数中的每个逗号后开始一个换行符,使用发布的代码很容易做到这一点
  • OT: about: printf("File doesn't exist, exiting!\n"); 这不会告诉用户错误的原因(它可能不是“文件不存在”建议使用:perror( "fopen failed" );,因为这将输出该错误消息和系统认为操作失败的文本原因。
  • OT:关于:exit(1); 您可能想了解:EXIT_FAILUREEXIT_SUCCESS,如声明所揭示:#include <stdlib.h>

标签: c file format scanf srt


【解决方案1】:

Mathieu 的评论给了我一个线索,我用这个解决了我的问题:

while (i = fgetc(input) != EOF) 
    {
        while ((i = fscanf(input, "%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%[^'']", &order, &csh, &csm, &css, &csms, &ceh, &cem, &ces, &cems, text) > 0))
        {

            printf("%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%s\n", order, csh, csm, css, csms, ceh, cem, ces, cems, text);



        }
    }

【讨论】:

  • 这不正确:while ((i = fscanf(input, "%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%[^'']", &order, &csh, &csm, &css, &csms, &ceh, &cem, &ces, &cems, text) > 0)) 建议:while ((i = fscanf(input, "%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%[^'']", &order, &csh, &csm, &css, &csms, &ceh, &cem, &ces, &cems, text) == 10)) 注意与 10(输入格式说明符的数量)的比较 任何其他返回值表示发生错误
  • OT:为了安全(避免任何可能的缓冲区溢出和由此产生的未定义行为)始终包含一个比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符。 1 小于长度,因为输入说明符“[...]”(和“%s”)总是将 NUL 字节附加到输入
  • 关于:while (i = fgetc(input) != EOF) 这将消耗输入文件中您不想丢失的字符。建议:while ((i = fscanf(input, "%d\n%d:%d:%d,%d --> %d:%d:%d,%d\n%255[^'']", &order, &csh, &csm, &css, &csms, &ceh, &cem, &ces, &cems, text) == 10)) 作为循环控制语句。并且由于变量'i'没有被使用,i =可以被删除
猜你喜欢
  • 2021-06-19
  • 2016-10-09
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多