我这里真的有问题。在从文件中读取字符时,我似乎并没有真正找到退出循环的最佳方法。我知道每个教程都表明我不应该使用while(!feof())但是他们除了在fots()中添加fgets()之外别提其他任何东西并且这不是真正适当的,因为我想要读取整个FILE内容我的变量。
while (!feof(newFile))
{
newString[i++] = fgetc(newFile);
}
newString[i] = '\0';
i = 0;
//this is the resoult seen with the debugger
newFile content = ABC
newString[0] = 65 (A)
newString[1] = 66 (B)
newString[2] = 67 (C)
newString[3] = 10 (\n)
newString[4] = -1
newString[5] = 0 (\0)
我正在寻找解决方案和一些关于如何改进算法的建议。
答案 0 :(得分:1)
int c;
while ((c = fgetc(newFile)) != EOF) newString[i++] = c;
newString[i] = '\0';
答案 1 :(得分:1)
为了将整个测试文件读入内存,我建议使用mmap。这样做的好处是,您的操作系统可以处理所有缓冲和读取,并且您可以将代码集中在手头的任务上。 (而且,它通常比自己缓冲更快。)
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
int
main (void)
{
int fd = open("filename", O_RDONLY);
if (fd == -1)
return 0; // file open failed
struct stat sb;
int res = fstat(fd, &sb);
if (res == -1)
return 0; // stat failed
size_t length = sb.st_size;
char *data = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (!data)
return 0; // mmap failed
// iterate over characters
size_t i;
for (i = 0; i < length; ++i)
printf("'%c'\n", data[i]);
munmap(data, length);
return 0;
}
答案 2 :(得分:0)
除了把fgets()放进去之外,他们真的没有提出任何建议,而且这不是真正合适的
这绝对是完全合适的。 fgets()
逐行读取文件,您可以将每一行附加到dybamically扩展缓冲区的末尾。
但是,如果您不想使用fgets()
,并且只想立即阅读该文件:请使用fread()
。
FILE *f = fopen("foo.txt", "rb");
if (!f)
abort(); // "handle" error
fseek(f, 0, SEEK_END);
size_t len = ftell(f);
fseek(f, 0, SEEK_SET);
char *buf = malloc(len + 1);
if (!buf)
abort();
if (fread(buf, len, 1, f) != 1) {
// handle reading error
}
buf[len] = 0;
fclose(f);