如何阅读文件C,fscanf的结尾

时间:2017-03-29 16:05:13

标签: c file eof

我从文件中读到的内容:一个P1 / s / e / t等/用于不同的行。在特定字母(如'a')之后,我必须收集一些数据,所以我不想使用fgets。它没有结束运行。请问你能帮帮我吗?

char com[21];
fscanf(src,"%s",com);
while(com!=EOF)
{
    if(com[0]=='a')
        fprintf(dest,"%s 1",com);
     if(com[0]=='s')
        fprintf(dest,"%s 2",com);
    fscanf(src,"%s",com);
}

2 个答案:

答案 0 :(得分:3)

简单的方法是测试fscanf()是否成功作为循环条件,并且在循环之前不需要fscanf()

char com[21];

while(fscanf(src,"%20s",com) == 1)
{
    if(com[0]=='a')
        fprintf(dest,"%s 1",com);
     if(com[0]=='s')
        fprintf(dest,"%s 2",com);
}

fscanf()返回成功扫描的项目数。所以,你不需要检查它是否是'已退回EOF

请注意,我更改了格式字符串以避免缓冲区溢出。我建议您使用fgets()而不是fscanf()(如果重要的话,请记得处理新行字符。)

答案 1 :(得分:1)

请注意,fscanf会返回integer,当达到文件结尾时,该EOF可以指示char com[21]; int ret; ret = fscanf(src,"%s",com); while(ret!=EOF) { if(com[0]=='a') fprintf(dest,"%s 1",com); if(com[0]=='s') fprintf(dest,"%s 2",com); ret = fscanf(src,"%s",com); } 。有关更多详细信息,请参阅手册页。

您的代码必须修改如下:

public ActionResult Edit([Bind(Include = "ID,FirstName,LastName,Email,deleted,AId")] Information personInformation)
{

    // to stop multiple calls to database
    var lstOfPeople = db.Information.Where(x => x.deleted == false).ToList();

    if (ModelState.IsValid)
    {

        if (lstOfPeople.Any(x => x.Email.Equals(personInformation.Email, StringComparison.CurrentCultureIgnoreCase) && x.ID != personInformation.ID))
        {
            ModelState.AddModelError("", "This email already exists!");
            return View(personInformation);
        }

        db.Entry(personInformation).State = EntityState.Modified; // error here
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(personInformation);
}