【问题标题】:Detect empty lines while reading from file从文件读取时检测空行
【发布时间】:2020-06-07 20:46:06
【问题描述】:

我正在处理一个需要处理文件的项目。我目前正在向文件中添加东西,但我正在尝试做的是,当我检测到一个空行时,我会打印一些东西,当该行包含一些东西时,我会打印其他东西。我试图将空行存储到一个字符中,并在 if 语句中将其与'' 进行比较,但我没有成功。

这是我的文件的样子,1,2,3,4,5,6,7 不在我的文件中,它只是代表行:

1 Nilton
2 10
3 Ok
4 Ola
5 Oh
6 2
7

这是我尝试的:

char file_nome_receita[LOAD], file_ingredientes[MAX], file_modo_de_preparo[MAX], 
file_nome_criador[LOAD], newline;

int file_tempo_preparo, file_vezes_preparado;

if (file == NULL) {
    printf("Nao ha receitas no arquivo!\n");
} else {
    func_select = 0;

     fgets(file_nome_receita, LOAD, file);
    fscanf(file, "%d\n", &file_tempo_preparo);
    fgets(file_ingredientes, MAX, file);
    fgets(file_modo_de_preparo, MAX, file);
    fgets(file_nome_criador, LOAD, file);
    fgets(buf, sizeof buf, file);
    sscanf(buf, "%d", &file_vezes_preparado);
    fscanf(file, "%c", &newline);
    if (newline == NULL)
    {
        printf("Bat");
    }

    fscanf(file, "%c", &newline);
    if (newline == '\n') {
        printf("result");
    }

警告;

 warning: comparison between pointer and integer
 39 |         if (newline == NULL)

【问题讨论】:

  • 你能用我的一段代码更好地解释一下吗?
  • fgets(file_nome_criador, MAX , file); --> fgets(file_nome_criador, LOAD , file); 或更好的fgets(file_nome_criador, sizeof file_nome_criador , file);
  • @chux-ReinstateMonica 我已经尝试过了,但我的 if 比较仍然不会打印“换行符”
  • 我计数 7 个连续调用以从文件中读取,错误检查绝对为零。
  • 那么不要将' '与前面的fscanf(file, "%d\n", &file_vezes_preparado);一起消费 提示:不要将fgets()*scanf()混用

标签: c


【解决方案1】:

混合使用 fets()fscanf() 会产生问题。

下面的"%d" 使用前导空格,然后是int 的文本。这里没问题。

fscanf(file, "%d\n", &file_vezes_preparado);

"\n" 消耗 0 个或多个空格,并且在检测到非空格之前不会返回。这不仅消耗了int之后的'\n',还消耗了下一行的前导' '


最好始终使用fgets()

// fscanf(file, "%d\n", &file_vezes_preparado);
char buf[80];
fgets(buf, sizeof buf, file);
sscanf(buf, "%d", &file_vezes_preparado);

健壮的代码也会检查函数的返回值。

【讨论】:

  • 所以我应该为我的 fscanf 更改这个?
  • 测试fgets()sscanf()的返回值怎么样?
  • @NiltonSchumacherF 考虑不使用fscanf(), scanf() 并仅将fgets() 用于输入。工作量更大,但更容易检测错误并避免此类问题。
  • @chqrlie 因为这个答案有“健壮的代码也会检查函数的返回值。”,我向你的good idea 点头。然而这里有很多需要解决的问题,这个答案解决了一个关键问题。
  • @chux-ReinstateMonica 我已经插入了您建议的 fget,但是,当我尝试将换行符与 '\n' 进行比较时,它将不起作用,但如果我将其与 NULL 进行比较,它会给出我一个警告,但它会起作用。警告是指针和整数之间的比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多