我正在尝试使用以下代码一次完全读取一个文件:
void readfile (FILE *fp, char *buf)
{
char *c = buf;
while (fscanf(fp, "%c", c) == 1);
}
int main (int argc, const char *argv[])
{
char *contents = (char *)malloc(1000);
FILE *file = fopen(argv[1], "r");
readfile(file, contents);
fclose(file);
printf("%s", contents);
free(contents);
return 0;
}
当我用适当的参数运行它时,我看不到任何输出。我知道我正在成功读取文件,因为当我打印每个字符时,我看到文件的内容,如下所示:
void readfile (FILE *fp, char *buf)
{
char *c = buf;
while (fscanf(fp, "%c", c) == 1)
printf("%c", *c);
}
我似乎无法获得contents
的价值。
答案 0 :(得分:0)
您没有在以下行中增加c
。因此,您正在阅读并将整个文件写入单个char
。
while (fscanf(fp, "%c", c) == 1);
答案 1 :(得分:0)
变化:
void readfile (FILE *fp, char *buf)
{
char *c = buf;
while (fscanf(fp, "%c", c) == 1);
}
成:
void readfile (FILE *fp, char *buf)
{
char *c = buf;
while (fscanf(fp, "%c", c) == 1) ++c;
// ^^^
}
Q&部分:
我知道我正在成功读取文件,因为当我打印每个字符时,我看到了文件的内容[...]
您反复打印缓冲区的相同位置中的字符。也就是说,您不会增加存储以下字符的指针。每次后续调用fscanf
都会覆盖buf[0]
。
答案 2 :(得分:0)
您正在替换' c'指向的字符数据。每次循环运行!! 继承人修复: `
void readfile (FILE *fp, char *buf)
{
char *c = buf;
while (fscanf(fp, "%c", c++) == 1); // increment the pointer.
*c = 0; // marking null at end of string
}
`
答案 3 :(得分:0)
使用char *c = buf;
,您可以为缓冲区中的第一个元素分配先前分配的缓冲区的起始地址,因此始终为fscanf
。您应该尝试使用while (fscanf(fp, "%c", c++) == 1)