我创建了一个从文件中读取一行的函数。结果是一个可打印的字符串但是当我在fopen中输入字符串时,fopen无法找到该文件。我认为readline读取的文件路径已损坏。我希望你能帮助我。代码在这里:
char *readUntilNewLine(FILE *file_stream, bool until_eof)
{
bool stop_reading = false;
int char_counter = 1;
char *line_string;
line_string = (char*)malloc(STRING_BLOCK);
if(line_string == NULL)
{
return NULL;
}
while(!feof(file_stream))
{
char current_char = fgetc(file_stream);
//printf("%c\n", current_char);
if(current_char == '\n')
{
//line_string[char_counter - 1] = '\0';
return line_string;
}
if(char_counter % STRING_BLOCK == 0)
{
printf("----\n");
line_string = realloc(line_string, STRING_BLOCK * char_counter);
if(line_string == NULL)
{
return NULL;
}
}
line_string[char_counter - 1] = current_char;
printf("%d ", strlen(line_string));
printf("%c ", current_char);
printf("%d\n", char_counter - 1);
char_counter += 1;
}
if(until_eof == true)
{
line_string[char_counter - 1] = (char)0;
}
else
{
return NULL;
}
}
答案 0 :(得分:1)
让我们手动执行readUntilNewLine()
,假设该文件包含a
b
c
\n
.
.
{{1 }}:
.
stop_reading = false
(你是一个乐观主义者;此时大多数程序员都会放char_counter = 1
,因为毕竟你当前没有读过任何字符)char_counter = 0
(对line_string = malloc(STRING_BLOCK)
的演员不会给你任何东西;此时char *
包含line_string[]
,其中?????????...?
是垃圾{{} 1}}发现那里)?
malloc()
;因为你没有读过任何东西,所以没有设定。 (C不是Pascal; {<1}}仅在之后设置为,您尝试读取文件末尾。)malloc()
(这是feof()
)feof()
current_char = fgetc(file_stream)
a
(现在是2)\n
line_string[char_counter - 1] = current_char
(这是char_counter += 1
)feof()
current_char = fgetc(file_stream)
b
(现在是3)\n
line_string[char_counter - 1] = current_char
(这是char_counter += 1
)feof()
current_char = fgetc(file_stream)
c
(现在是4)\n
line_string[char_counter - 1] = current_char
(这是换行符)char_counter += 1
成功feof()
哇!你返回一个未终止的字符串!此时current_char = fgetc(file_stream)
包含current_char == '\n'
,其中return line_string
是在那里找到的任何垃圾line_string[]
。