从文件中读取换行符分隔的项目
Posted
技术标签:
【中文标题】从文件中读取换行符分隔的项目【英文标题】:Reading newline-separated items from file 【发布时间】:2018-05-10 19:06:27 【问题描述】:我的 .c 程序有问题。我来解释一下:
我有 2 个文件(listePassword.txt 和 system_1.phl) 第一个文件包含 10 个密码(如 123456、12345678、admin 等) 第二个包含 10 个哈希值(例如 f31041d6d9c2031086bfe561d8e4b63f 或 77b6508f00223102d793837b9dd60358)我创建了一个函数来读取这些文件上的行(1 个字/逐行散列)。 代码:
int main(int argc, char const *argv[])
FILE *f = fopen("listePasswords.txt","r");
FILE *S1 = fopen("system_1.phl", "r");
unsigned char passwords[10][32];
unsigned char system_1[10][32];
lireFichier(f, passwords);
lireFichier(S1, system_1);
现在是函数:
void lireFichier(FILE *f, unsigned char (*resultats)[32])
int i = 0;
if(f)
while(fgets(resultats[i], sizeof(resultats[i]), f) != 0)
printf("%s\n", resultats[i]);
i++;
fgetc(f);
程序不读取每个密码的第一个字符,除了第一个单词,而且我没有 system_1.phl 的所有行。
你能帮帮我吗? :D (不要使用“”或“”,我可能没有将它们全部粘贴)。
谢谢大家! (对不起,我是法国人,英语不太好啊啊啊)。
【问题讨论】:
【参考方案1】:问题在于循环中的fgetc(f)
。那就是读取下一行的第一个字符。
我假设您打算让它在行尾读取换行符。但是fgets()
将其包含在其结果中,因此您无需跳过它。相反,您应该将其从 resultsat[i]
中删除:
while (fgets(resultsat[i], sizeof resultat[i], f) != 0)
int len = strlen(resultat[i]);
if (len > 0 && resultat[i][len-1] == '\n')
resultat[i][len-1] = '\0';
printf("%s\n", resultat[i]);
i++;
您还需要将数组声明中的[32]
至少更改为[34]
。您的哈希长度为 32 个字符,但 fgets()
将读取以下换行符,并且还需要添加一个空字节来终止字符串。所以你需要在数组中至少多出 2 个字节。
【讨论】:
您的回答解决了密码问题(这是我的错误,我忘记了我尝试使用 fgetc 跳过最后一个字符,但没关系)。但是问题已经出现在哈希上......当我使用你写的内容时,我得到了这个结果:lireFichier(S1, system_1); for (int i = 0; i 您的散列长度为 32 个字符,因此数组需要为[33]
以便为空字节留出空间。
是的,现在真的很好!但我发现我的文件存在另一个问题,所以我用十六进制编辑器打开它。字符串是:f31041d6d9c2031086bfe561d8e4b63f。 77b6508f00223102d793837b9dd60358。所以,我需要阅读 34 个字符,而不是 33 个字符。但是在你的帮助下,现在很好!非常感谢:D以上是关于从文件中读取换行符分隔的项目的主要内容,如果未能解决你的问题,请参考以下文章