我正在寻找一种方法来使用 C void 函数来读取文件和 stdin 流>。我正在尝试使用此功能:
#define ENTER 10 //'\n' ASCII code
........
void read(FILE *stream, char *string) {
char c;
int counter = 0;
do {
c = fgetc(stream);
string = realloc(string, (counter+1) * sizeof(char));
string[counter++] = c;
} while(c != ENTER && !feof(stream));
string[counter-1] = '\0';
}
但它仅适用于 stdin 流。当我使用文本文件时,文件内容在函数外部不可见。我把这个函数称为:
read(stdin, inputString);
read(inputFile, fileContent);
仅适用于第一种情况。
P.S。:最初,inputString fileContent已声明为
char *inputString = malloc(sizeof(char));
char *fileContent = malloc(sizeof(char));
我知道 fgetc 返回 int ,char重新分配的char很贵(但我只需要使用必要的内存)而EOF或'\ n'是存储在字符串中(但后面用0-terminator替换)。
答案 0 :(得分:5)
它可能无法正常工作,因为您重新分配字符串但不返回指向新分配的指针,并且因为您错误处理fgetc()
。
您可能需要:
void read(FILE *stream, char **string)
{
int c;
int counter = 0;
int available = 0;
while ((c = fgetc(stream)) != EOF && c != ENTER)
{
if (counter >= available)
{
int new_size = (available + 2) * 2;
void *space = realloc(*string, new_size);
if (space == 0)
// Handle out of memory reporting?
return;
*string = space;
available = new_size;
}
(*string)[counter++] = c;
}
(*string)[counter] = '\0';
}
你会这样称呼:
read(stdin, &inputString);
read(inputFile, &fileContent);
这里有很多更正;仍然可以并且应该做出改进。
将指针传递给指针,以便更改可以反映在调用代码中。在原始代码中,如果realloc()
调用可以增加当前块,但是当它必须移动内存时,您可能会逃脱调用函数中无法使用移动的位置。
fgetc()
的返回类型为int
,而不是char
。
您应该首选while
个循环到do ... while
循环。如果您的代码遇到EOF,它会尝试将字符值存储到数组中。
(还是个问题)string
的初始分配在很大程度上被忽略了;它被视为零长度分配。
您一次增加一个字符存储的空间 - 这是低效的。修订后的代码每次大约翻倍可用空间。它还为终止空字节分配足够的空间。
不加固定:标准C不保留名称read()
,但如果您使用任何POSIX函数,则有效保留名称。
您(仍然)无法报告错误。我实际上更喜欢一个更像是的函数:
char *read_line(FILE *stream)
{
int c;
int counter = 0;
int available = 2;
char *string = malloc(available);
if (string == 0)
return string;
while ((c = fgetc(stream)) != EOF && c != ENTER)
{
if (counter >= available)
{
int new_size = (available + 2) * 2;
void *space = realloc(string, new_size);
if (space == 0)
{
free(string);
return 0;
}
string = space;
available = new_size;
}
string[counter++] = c;
}
string[counter] = '\0';
return string;
}
您还应该查看POSIX getline()
功能
答案 1 :(得分:0)
你的功能很好。请查看以下代码:
#include <stdio.h>
#define ENTER 10 //'\n' ASCII code
void read(FILE *stream, char **string) {
char c;
int counter = 0;
do {
c = fgetc(stream);
*string = realloc(*string, (counter+1) * sizeof(char));
(*string)[counter++] = c;
} while(c != ENTER && !feof(stream));
(*string)[counter-1] = '\0';
}
int main()
{
char *p = malloc(1);
read(fopen("sam.txt", "r"), &p);
printf("%s\n", p);
return 0;
}
sam.txt
的内容完全打印出来。
我猜你传递的是file name
而不是file pointer to the file
。您还需要传递指针的引用以在p
上应用realloc。希望这会有所帮助。