gpt4 book ai didi

c - 返回 C 中文件的下一行

转载 作者:行者123 更新时间:2023-11-30 21:13:15 26 4
gpt4 key购买 nike

我正在使用 C 开发一个项目。该项目的目的是编写一个函数,每次调用该函数时都会返回文件的下一行。

我只能使用 mallocfreeread 函数。

我尝试过的代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "get_next_line.h"

int my_putstr(char *str)
{
int i;

if (str == NULL)
return (1);

i = 0;
while (str[i] != '\0')
{
write(1, &str[i], 1);
i = i + 1;
}
return (0);
}

char *my_strcpy(char *src, char *dest)
{
int i;
int r;

r = 0;
i = 0;

if (src == NULL)
return (dest);

while (dest != NULL && dest[i] != '\0')
i = i + 1;

while (src[r] != '\0')
{
dest[i] = src[r];
i = i + 1;
r = r + 1;
}
dest[i] = '\0';
return (dest);
}

int check_back_n(t_stock *stock)
{
int i;

if (stock->save == NULL)
return (1);

i = 0;
while (stock->save[i] != '\0')
{
if (stock->save[i] == '\n')
return (0);
i = i + 1;
}
return (1);
}

int my_realloc(t_stock *stock)
{
if ((stock->temp = malloc(sizeof(char) *
(READ_SIZE * stock->counter) + 1)) == NULL)
return (1);

stock->temp = my_strcpy(stock->save, stock->temp);
free(stock->save);

if ((stock->save = malloc(sizeof(char) *
(READ_SIZE * (stock->counter + 1)) + 1)) == NULL)
return (1);

stock->save = my_strcpy(stock->temp, stock->save);
free(stock->temp);
return (0);
}

char *fill_over(t_stock *stock, char *over)
{
stock->r = 0;
stock->i = 0;

while (stock->save[stock->i] != '\n')
stock->i = stock->i + 1;

stock->save[stock->i] = '\0';
stock->i = stock->i + 1;

if ((over = malloc(sizeof(char) * READ_SIZE) + 1) == NULL)
return (NULL);

while (stock->save[stock->i] != '\0')
{
stock->save[stock->i] = over[stock->r];
stock->save[stock->i] = '\0';
stock->i = stock->i + 1;
stock->r = stock->r + 1;
}
return (over);
}

char *get_next_line(const int fd)
{
t_stock stock;
static char *over;

stock.counter = 2;
if ((stock.save = malloc(sizeof(char) * READ_SIZE) + 1) == NULL)
return (NULL);

stock.save = my_strcpy(over, stock.save);
free(over);
while (check_back_n(&stock) == 1)
{
if (my_realloc(&stock) == 1)
return (NULL);

if ((stock.buffer = malloc(sizeof(char) * READ_SIZE) + 1) == NULL)
return (NULL);

if ((stock.read_return = read(fd, stock.buffer, READ_SIZE)) == -1 ||
(stock.read_return == 0))
return (stock.save);

stock.counter = stock.counter + 1;
stock.save = my_strcpy(stock.buffer, stock.save);
free(stock.buffer);
}
if ((over = fill_over(&stock, over)) == NULL)
return (NULL);

return (stock.save);
}

int main()
{
char *s;
int fd;

fd = open("test", O_RDONLY);
while (s = get_next_line(fd))
{
my_putstr(s);
write(1, "\n", 1);
free(s);
}
return (0);
}

当我尝试运行代码时,出现以下错误:

*** Error in `./a.out': free(): invalid pointer: 0x0000000002024031 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7283f)[0x7fbb5b3f383f]
/lib64/libc.so.6(+0x780ae)[0x7fbb5b3f90ae]
/lib64/libc.so.6(+0x78db6)[0x7fbb5b3f9db6]
./a.out[0x400a38]
./a.out[0x400ab4]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fbb5b3a2b05]
./a.out[0x4005c9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:07 3146955 /home/degana_r/rendu/CProgElem/GetNextLine/CPE_2015_getnextline/a.out
00600000-00601000 r--p 00000000 08:07 3146955 /home/degana_r/rendu/CProgElem/GetNextLine/CPE_2015_getnextline/a.out
00601000-00602000 rw-p 00001000 08:07 3146955 /home/degana_r/rendu/CProgElem/GetNextLine/CPE_2015_getnextline/a.out
02024000-02045000 rw-p 00000000 00:00 0 [heap]
7fbb5b16a000-7fbb5b180000 r-xp 00000000 08:05 157433 /lib64/libgcc_s.so.1
7fbb5b180000-7fbb5b37f000 ---p 00016000 08:05 157433 /lib64/libgcc_s.so.1
7fbb5b37f000-7fbb5b380000 r--p 00015000 08:05 157433 /lib64/libgcc_s.so.1
7fbb5b380000-7fbb5b381000 rw-p 00016000 08:05 157433 /lib64/libgcc_s.so.1
7fbb5b381000-7fbb5b51f000 r-xp 00000000 08:05 147837 /lib64/libc-2.19.so
7fbb5b51f000-7fbb5b71e000 ---p 0019e000 08:05 147837 /lib64/libc-2.19.so
7fbb5b71e000-7fbb5b722000 r--p 0019d000 08:05 147837 /lib64/libc-2.19.so
7fbb5b722000-7fbb5b724000 rw-p 001a1000 08:05 147837 /lib64/libc-2.19.so
7fbb5b724000-7fbb5b728000 rw-p 00000000 00:00 0
7fbb5b728000-7fbb5b748000 r-xp 00000000 08:05 162636 /lib64/ld-2.19.so
7fbb5b91e000-7fbb5b921000 rw-p 00000000 00:00 0
7fbb5b946000-7fbb5b948000 rw-p 00000000 00:00 0
7fbb5b948000-7fbb5b949000 r--p 00020000 08:05 162636 /lib64/ld-2.19.so
7fbb5b949000-7fbb5b94a000 rw-p 00021000 08:05 162636 /lib64/ld-2.19.so
7fbb5b94a000-7fbb5b94b000 rw-p 00000000 00:00 0
7ffc76b9d000-7ffc76bbe000 rw-p 00000000 00:00 0 [stack]
7ffc76be8000-7ffc76bea000 r-xp 00000000 00:00 0 [vdso]
7ffc76bea000-7ffc76bec000 r--p 00000000 00:00 0 [vvar]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted

最佳答案

由于这是给您的作业,因此最好的答案是让您了解 free()C 中的工作原理。

Standard C Free

此外,了解 C 中堆栈和堆的区别。您在代码中将它们混合得很糟糕。

7. Memory : Stack vs Heap

关于c - 返回 C 中文件的下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780767/

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