我从文件中读到的内容:一个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);
}
答案 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);
}