从文件读取时,每隔一行打印一个空行

时间:2017-12-12 12:08:53

标签: c

在我的.txt文件中,我有关注数据。

姓名:姓名
得分:0.00%
姓名:姓名 得分:0.00%
姓名:姓名 得分:6.67%

我尝试使用此代码

public class MakeInactiveUsersPassiveWorker : PeriodicBackgroundWorkerBase, ISingletonDependency
{
    private readonly IRepository<User, long> _userRepository;

    public MakeInactiveUsersPassiveWorker(AbpTimer timer, IRepository<User, long> userRepository)
        : base(timer)
    {
        _userRepository = userRepository;
        Timer.Period = 5000; //5 seconds (good for tests, but normally will be more)
    }

    [UnitOfWork]
    protected override void DoWork()
    {
        using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant))
        {
            var oneMonthAgo = Clock.Now.Subtract(TimeSpan.FromDays(30));

            var inactiveUsers = _userRepository.GetAllList(u =>
                u.IsActive &&
                ((u.LastLoginTime < oneMonthAgo && u.LastLoginTime != null) || (u.CreationTime < oneMonthAgo && u.LastLoginTime == null))
                );

            foreach (var inactiveUser in inactiveUsers)
            {
                inactiveUser.IsActive = false;
                Logger.Info(inactiveUser + " made passive since he/she did not login in last 30 days.");
            }

            CurrentUnitOfWork.SaveChanges();
        }
    }
}

获得此输出:

姓名:姓名
得分:0.00%

姓名:姓名
得分:0.00%

姓名:姓名
得分:6.67%

而不是我得到低于输出。

测试历史

姓名:姓名

得分:0.00%

姓名:姓名

得分:0.00%

姓名:姓名

得分:6.67%

得分:6.67%

4 个答案:

答案 0 :(得分:1)

两件事:puts函数写一个换行符; fgets函数可能包含缓冲区中的换行符。

这意味着当您首先打印singleLine时会有换行符(因为fgets将其放在那里),然后puts会写入自己的换行符。

删除fgets写入缓冲区的换行符,或者不使用puts

答案 1 :(得分:1)

while(!feof(fPointer)){
    fgets(singleLine, 50, fPointer);
    puts(singleLine);
    int i;
    for(i=0; i>=0; i++){
        if(i%2==0){
            printf("\n");
        }
        break;
    }
}

有几点需要注意:

  1. fgets()读取直到换行符,包含在缓冲区中。因此,在以下puts()调用中,您之后已经输出了换行符,puts()甚至自己添加换行符。

  2. 请考虑以下代码:

    int i;
    for(i=0; i>=0; i++){
        if(i%2==0){
            printf("\n");
        }
        break;
    }
    

    你实际上是在打印一个换行符,然后打破循环。所以它与普通的

    没有区别
    printf("\n");
    
  3. 计算上述两个内容,实际上每个while循环实际打印3个换行符:一个是fgets()写入缓冲区,一个来自puts(),一个是手动。

    要修复它们,您需要完成两项工作:

    1. fgets()给你的内容中删除换行符:

      singleLine[strlen(singleLine) - 1] = '\0';
      
    2. 让循环更好:

      int i = 0; // Must initialize!
      while (condition) {
          other_statements;
      
          i++;
          if (i%2==0) {
              printf("\n");
          }
          // Do nothing if 'i' is odd
      }
      
    3. 停止使用while (!feof())。请检查fgets的返回值:

      char *ret = fgets( ... );
      if (ret == NULL)
          break;
      

答案 2 :(得分:0)

    printf("Test History\n\n");

    FILE *pToFile = fopen("history.txt", "r");

    char input[50];
    int i=0;
    while(fgets(input, 50, pToFile)){
        printf("%s", input);
        i++;
        if(i%2==0){
            printf("\n");
        }
    }
    fclose(pToFile);

答案 3 :(得分:-2)

麻烦在于你的逻辑 - 你在'while'中有'if'所以它循环并依赖每个'while'(来自你文件的行)。

我不是专家,所以没有代码,但似乎你得到了命令。我将使用的逻辑是查看行中的文本并从中添加'\ n'。

即。

if singleline (contains - however you do that in c) "%" 

添加\ n