我给了一个文件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
如实例文件中所示更正输出:
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
函数来递增和扫描所有其他数据点?
答案 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