gpt4 book ai didi

c - 这不是同一个逻辑吗?不同的结果

转载 作者:行者123 更新时间:2023-11-30 15:31:17 24 4
gpt4 key购买 nike

我不明白这两个代码如何给出不同的结果?

1

int main()
{

struct stat buf1;
struct stat buf2;

FILE *fp1, *fp2;
int ch1, ch2;
clock_t elapsed;
char fname1[40], fname2[40];

printf("Enter name of first file:");
fgets(fname1, 40, stdin);
while (fname1[strlen(fname1) - 1] == '\n')
{
fname1[strlen(fname1) -1] = '\0';
}

printf("Enter name of second file:");
fgets(fname2, 40, stdin);
while (fname2[strlen(fname2) - 1] == '\n')
{
fname2[strlen(fname2) -1] = '\0';
}

fp1 = fopen(fname1, "r");
if (fp1 == NULL)
{
printf("Cannot open %s for reading\n", fname1);
exit(1);
}

fp2 = fopen(fname2, "r");
if (fp2 == NULL)
{
printf("Cannot open %s for reading\n", fname2);
exit(1);
}

stat(fname1, &buf1);
size_t size1 = buf1.st_size;

stat(fname2, &buf2);
size_t size2 = buf2.st_size;

printf("Size of file 1: %zd\n", size1);
printf("Size of file 2: %zd\n", size2);

elapsed = clock(); // get starting time

size_t smallest = 0;

if(size1 < size2)
{
smallest = size1;
}
else
{
smallest = size2;
}

int i;

unsigned long long counter = 0;

ch1 = getc(fp1);
ch2 = getc(fp2);

for(i = 0; i < smallest; i++)
{
ch1 = getc(fp1);
ch2 = getc(fp2);

if((ch1 ^ ch2) == 0)
{
counter++;
}
}

fclose (fp1); // close files
fclose (fp2);

float percent = (float)counter / (float)smallest * 100.0f ;

printf("Counter: %u Total: %u\n", counter, smallest);
printf("Percentage: %.2f%\n", percent);

elapsed = clock() - elapsed; // elapsed time
printf("That took %.2f seconds.\n", (float)elapsed/CLOCKS_PER_SEC);
return 0;
}

2

... 


ch1 = getc(fp1); // read a value from each file
ch2 = getc(fp2);

while(1) // keep reading while values are equal or not equal; only end if it reaches the end of one of the files
{
ch1 = getc(fp1);
ch2 = getc(fp2);

if((ch1 ^ ch2) == 0)
{
counter += 1;
}

total += 1;

if ( ( ch1 == EOF) || ( ch2 == EOF)) // if either file reaches the end, then its over!
{
break; // if either value is EOF
}
}

fclose (fp1); // close files
fclose (fp2);

float percent = (float)counter / (float)total * 100.0f ;

printf("Counter: %u Total: %u\n", counter, total);
printf("Percentage: %.2f%\n", percent);

elapsed = clock() - elapsed; // elapsed time
printf("That took %.4f seconds.\n", (float)elapsed/CLOCKS_PER_SEC);
return 0;
}

第二个代码给了我更高的复制结果?它们不应该是一样的吗?只有一个效率更高。我通过添加并行性使用 Xeon Phi 运行第一个代码,但首先,我希望两个代码具有相同的重复率。

最佳答案

明显的区别是,2 在读取到 EOF 时停止,而 1 则不会。实际上,2 计数 +1,然后在读取到 EOF 时停止。您应该在递增计数器之前执行 EOF 检查。

如果您更新1以同时检查EOF,您可能会发现相同的结果。

此外,还不清楚为什么在每个循环开始之前从每个文件中读取并丢弃一个字符。

也许您忽略了 st_size 可能与可读字节数不对应,特别是当您将文件作为文本流打开时。 (例如,在 Windows 中,st_size 会将 CR-LF 计为 2,但 getc 只会获取 \n)。

您可以尝试以二进制模式打开文件(“rb”)。此外,在 2 情况下实际查看 total 的值(并报告哪个文件命中 EOF)可能会有所启发。

关于c - 这不是同一个逻辑吗?不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com