在do..while循环中增加sscanf()并将行存储到结构中

时间:2016-12-07 19:41:41

标签: c file struct do-while scanf

我给了一个文件instance10_002。我试图将MST数据点存储到我已经创建的结构中。从我的调试printf语句中,我可以看到我已经成功遍历文件并到达了我的MST数据点。

这是我的代码:

void collect_edges(char filename[31])
{

  int counter = 0, check = 0;
  char c, str[64];
  int index;
  input_file = fopen(filename, "r");
  if (input_file == NULL)
    {
      printf("Input file does not exist\n");
      exit(1);
    }

  while (fgets(str, 64, input_file))
    {
      c = str[0];
      if (c != '#' && c != '\n')
        {
          counter++;
          printf("Check for counter\n");
          if (counter == 2)
            {
              printf("Check Check\n");
              sscanf(str, "%d", &num_pt);
              printf("Check for counter 2\n");
              index = num_pt + 3;
            }


           if (counter == (index))
             {
               printf("Check for counter 13\n");
               printf("Counter is: %d\n", counter);
               do {
                 sscanf(str, "%d %d %d", &points[counter-index].parent, &points[counter-index].x, &points[counter-index].distance_to_tree);
                 check++;
                 counter++;
               } while (check <= num_pt - 2);
               break;
             }
         }
    }
  fclose(input_file);

}

我使用do..while循环将所有MST数据点存储到我的结构中,但是当我去访问它们时,它打印出0 9 45,这是 {{1我的结构的,而不是所有索引的正确数据。

通过以下方法输出:

0th index

Output

如实例文件中所示更正输出:

  

5 8 40

我最初认为我的计数器没有在collect_edges(argv[inputfile]); printf("%d\n", points[3].parent); printf("%d\n", points[3].x); printf("%d\n", points[3].distance_to_tree); 循环中递增但是我已经包含了增量,现在它扫描第一个MST数据行并将其保存在结构的所有索引中。 有没有办法增加do..while函数来递增和扫描所有其他数据点?

1 个答案:

答案 0 :(得分:1)

更新:我解决了我的问题!

进行更多研究后,我发现最好在sscanf循环中使用do..while代替fscanf,因为sscanf使用输入文件流。因此,我不必创建一个循环来进一步迭代每一行,就像我必须为fscanf一样。

根据counter更改我的代码时,我的程序会产生正确的输出。

此外,我必须硬增加我的counter才能使索引正确无误。也可以通过将index保持为相同而硬递减 if (counter == (index)) { printf("Check for counter 13\n"); printf("Counter is: %d\n", counter); do { fscanf(input_file, "%d %d %d", &points[(counter + 1)-index].parent, &points[(counter + 1)-index].x, &points[(counter+1)-index].distance_to_tree); check++; counter++; } while (check <= num_pt - 2); break; 来完成以下操作。

更改代码结构:

collect_edges(argv[inputfile]);
printf("%d\n", points[3].parent);
printf("%d\n", points[3].x);
printf("%d\n", points[3].distance_to_tree);

执行以下操作后输出:

$Serverperbatch = 2
$job = 0
$job = $Serverperbatch - 1 
$batch = 1

While ($job -lt $rdsservers.count) {
    $ServerBatch = $rdsservers[$job .. $job]
    $jobname = "batch$batch"
Start-job -Name $jobname -ScriptBlock {
    param ([string[]]$rdsservers)
    Foreach ($rdsserver in $rdsservers) {
        try {
    query user /server:$rdsserver 2>&1 | select -skip 1 | ? {($_ -split "\s+")[-5]} | % {logoff ($_ -split "\s+")[-6] /server:$rdsserver /V}
    $RDSH=Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace "root\CIMV2\terminalservices" -ComputerName $rdsserver -Authentication PacketPrivacy -Impersonation Impersonate
    $RDSH.SessionBrokerDrainMode=0
    $RDSH.put() > $null
   }
     catch {}

} -ArgumentList (.$serverbatch)
    $batch += 1
    $Job = $job + 1
    $job += $serverperbatch

    If ($Job -gt $rdsservers.Count) {$Job = $rdsservers.Count}
    If ($Job -gt $rdsservers.Count) {$Job = $rdsservers.Count}
  }
}
Get-Job | Wait-Job | Receive-Job

Corrected Output