从文件中读取换行符分隔的项目

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

以上是关于从文件中读取换行符分隔的项目的主要内容,如果未能解决你的问题,请参考以下文章

读取换行符分隔文件并丢弃换行符的最佳方法?

python读取以非换行符分隔的超大文件,并逐行输出

文本IO 二进制IO

将文件读入以逗号和换行符分隔的向量

shell怎样随机读写遍历文件中指定分隔符的记录

将逗号分隔的 JSON 转换为换行符分隔的节点