関数の実装をコード化する必要がありますが、FILE *
ではなくファイルのファイル記述子を使用する必要があります。私はmalloc()
とfree()
を使用することが許されているだけでなく、5つの機能が最大25行の長さになっています。 私はCの初心者ですが、私のコードはうまくいきませんが、私はプロジェクトを正しく行ったと思います。getline()implentationのコード化 - Valgrindエラー
私はそれを実行すると問題なく動作しますが、valgrindはファイルの長さとREAD_SIZE(ヘッダーに定義されているマクロ)に依存するx definetely lost x bytes
を示しています。
valgrindの--leak-check=full
によると、私は関数でメモリリークを持っています。これは、malloc dest
です。私はしようとしましたが、どこで自由にすべきか/何か他のことをするべきではありません任意のヘルプまたはヒントに
#define SOF(x) sizeof(x) // Why in the comments
int main(int ac, char **av)
{
int fd;
char *s;
UNUSED(ac);
if (!av[1])
return 1;
fd = open(av[1], O_RDONLY);
while ((s = get_next_line(fd)))
{
printf("%s\n", s);
free(s);
}
close(fd);
}
ありがとう:あなたがテストしたい場合
char *get_next_line(const int fd)
{
static char *remaining = "";
char *buffer;
ssize_t cread;
size_t i;
i = 0;
if (remaining == NULL)
return (NULL);
if ((buffer = malloc(SOF(char) * READ_SIZE + 1)) == NULL ||
(cread = read(fd, buffer, READ_SIZE)) < 0)
return (NULL);
buffer[cread] = 0;
remaining = str_realloc_cat(remaining, buffer);
while (remaining[i])
{
if (remaining[i] == 10)
{
remaining[i] = 0;
buffer = str_create_cpy(remaining);
remaining = remaining + i + 1;
return (buffer);
}
i++;
}
return (check_eof(fd, buffer, remaining, cread));
}
char *str_realloc_cat(char *rem, char *buf)
{
size_t i;
size_t dest_i;
char *dest;
i = (dest_i = 0);
if ((dest = malloc(SOF(char) * (str_len(rem) + str_len(buf) + 1))) == NULL)
return (NULL);
while (rem[i])
{
dest[dest_i] = rem[i];
dest_i++;
i++;
}
i = 0;
while (buf[i])
{
dest[dest_i] = buf[i];
dest_i++;
i++;
}
dest[dest_i] = 0;
free(buf);
return (dest);
}
char *check_eof(const int fd, char *buffer, char *remaining, ssize_t cread)
{
if (cread == 0)
return (NULL);
if (cread < READ_SIZE)
{
buffer = remaining;
remaining = NULL;
return (buffer);
}
return (get_next_line(fd));
}
char *str_create_cpy(const char *src)
{
char *dest;
size_t i;
i = 0;
if ((dest = malloc(sizeof(char) * str_len(src) + 1)) == NULL)
return (NULL);
while (src[i])
{
dest[i] = src[i];
i++;
}
dest[i] = 0;
return (dest);
}
int str_len(const char *str)
{
size_t i;
i = 0;
while (str[i])
i++;
return (i);
}
メインfuncton:
は、ここに以下の私のコードです。
'のはsizeof(charは)'常に1で、汚染しませんそれとあなたのコード。 – DyZ
'#define SOF(x)sizeof(x)'を使用する - 図示されていませんが、推測されていません - 少し無意味です。それは混乱の犠牲を払って、1通話につき3文字の入力を節約します。良いトレードオフではありません。 –
こんにちは、両方のご意見ありがとうございます。私は 'sizeof(char)'が常に1であることを知っていますが、それは良い習慣だと思っていますので、決して忘れないようにしてください。そして、何とかcharが別のシステムで1バイト以上あるなら、しかし)。また、SOFは実際にはsizeofの定義です。それは醜いですが、1行につき80文字、関数ごとに25行しか使わなければならないので、私のコード全体を再度構造化することなく唯一の方法でした。 –