gpt4 book ai didi

c - 如何正确从 txt 文件中读取位串,以便计算所有字符串组合的汉明距离

转载 作者:行者123 更新时间:2023-11-30 16:23:44 25 4
gpt4 key购买 nike

我的目标是能够迭代从文本文件读取的所有位字符串,以便我可以计算字符串所有组合之间的汉明距离。例如,我有一个包含 500 个位串的 txt 文件,其中每个位串的长度为 5093。我想从文件中读取字符串 s1 和 s2,然后计算它们之间的汉明距离。本质上,我试图迭代文件中的字符串来计算所有 500*499/2 = 124,750 个组合的 HD,以便我可以计算平均值、标准偏差并绘制直方图。我可以在 python 中使用 readlines() 读取字符串并将它们存储在列表中来完成此操作。然后,使用 for 循环迭代所有 (s1) 字符串,并将它们与使用嵌套 for 循环从列表中读取的 (s2) 字符串进行比较。现在,我正在重新处理这个问题,以温习我的 C。我当前的方法包括以类似的方式迭代文件,并使用两次调用 fgets() 读取位字符串,然后删除回车符。我遇到的问题是,当我尝试调用第二个 fgets() 来获取 s2 时,位串的末尾被缩短了约 300 个字符,并且我计算了 499 次汉明距离,而不是预期的 127,450 次距离计算。当我使用 fgets() 一次并注释掉嵌套的 while 循环时,我能够读取完整的位字符串。如果您能帮助我理解实现中的问题以及实现目标的正确方法,我将不胜感激。谢谢!

编辑:初始化变量,并重置 i 和 hd 以进行 HD 计算。提供了包含位串的 txt 文件的类似示例。在此示例中,有 4 个长度为 16 的位串,而不是 500 个长度为 5093 的位串。在本例中,目标是计算所有 6 个位串对组合的 HD。

示例 txt 文件

0011010000111010
1001001001110100
1110110010000100
0111011011111001

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 6000
#define CHIPS 500

int main(int argc, char *argv[]) {

FILE* fp;

char buffer[SIZE];
char s1[SIZE];
char s2[SIZE];
int i = 0, j = 0, hd = 0;

if(argc != 2) {
fprintf(stderr, "USAGE: ./<executable> <bitstring file>\n");
return 1;
}
else if ((fp = fopen(argv[1], "r")) == NULL) {
perror("ERROR: File not found.\n");
return 1;
}
/* for(i = 0; i < CHIPS; i++) {
fgets(s1,sizeof(s1),fp);
s1[strlen(s1) - 1] = '\0';
printf("%s\n", s1);
printf("%d\n", i);
for(j = 0; j < CHIPS; j++) {
fgets(s2, sizeof(s2),fp);
s2[strlen(s2) - 1] = '\0';
printf("%s\n", s2);
printf("%d", j);
}

}
fclose(fp);
*/
while(fgets(s1,sizeof(s1), fp) != NULL) {
//memcpy(s1,buffer, sizeof(s1));
s1[strlen(s1) - 1] = '\0';
printf("%s\n", s1);

while(fgets(s2, sizeof(s2), fp) != NULL) {
s2[strlen(s2) - 1] = '\0';

while(s1[i] != '\0') {
if(s1[i] != s2[i])
hd++;
i++;
}
printf("Hamming Distance: %d\n", hd);
i = 0;
hd = 0;
}

}
fclose(fp);

return 0;
}

示例输出

...
Hamming Distance: 2576

最佳答案

OP 已经了解(根据评论)现在初始化变量的错误。

要循环思考 N*(N-1)/2 次,一个简单的方法会记住当前 s1 行末尾的文件偏移量。后面的代码会寻求每个循环。

更健壮的代码会将所有内容读入内部存储器 - 但下面是一个快速编码的替代方案。

与许多代码开发一样,首先集中精力实现正确的功能,然后提高性能。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 6000
#define CHIPS 500

int main(void) {
FILE* fp;
char s1[SIZE];
char s2[SIZE];

fp = fopen("junk.txt", "w");
if (fp == NULL) {
perror("ERROR: File.\n");
return 1;
}
fprintf(fp, "%s\n","0011010000111010");
fprintf(fp, "%s\n","1001001001110100");
fprintf(fp, "%s\n","1110110010000100");
fprintf(fp, "%s\n","0111011011111001");
fclose(fp);

FILE *fp1 = fopen("junk.txt", "r");
if (fp1 == NULL) {
perror("ERROR: File not found.\n");
return 1;
}

long offset = 0;
for (;;) {
fseek(fp1, offset, SEEK_SET);
if (fgets(s1, sizeof(s1), fp1) == NULL) break;
s1[strcspn(s1, "\n")] = 0;
offset = ftell(fp1); // record location
if (offset == -1) break;

while (fgets(s2, sizeof(s2), fp1) != NULL) {
s2[strcspn(s2, "\n")] = 0;
size_t i = 0;
size_t hd = 0;
while (s1[i] >= '0' && s1[i] <= '1') {
if (s1[i] != s2[i]) {
hd++;
}
i++;
}
printf("s1 <%s> " "s2 <%s> " "Hamming Distance: %zu\n", s1 ,s2, hd);
}

}
fclose(fp);
puts("Done");
return 0;
}

输出:每 4*3/2 6 个汉明码

s1 <0011010000111010> s2 <1001001001110100> Hamming Distance: 8
s1 <0011010000111010> s2 <1110110010000100> Hamming Distance: 10
s1 <0011010000111010> s2 <0111011011111001> Hamming Distance: 6
s1 <1001001001110100> s2 <1110110010000100> Hamming Distance: 10
s1 <1001001001110100> s2 <0111011011111001> Hamming Distance: 8
s1 <1110110010000100> s2 <0111011011111001> Hamming Distance: 10
Done

关于c - 如何正确从 txt 文件中读取位串,以便计算所有字符串组合的汉明距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53908591/

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