一些比feof更好的Loop exiter()

时间:2014-01-25 10:12:47

标签: c file character

我这里真的有问题。在从文件中读取字符时,我似乎并没有真正找到退出循环的最佳方法。我知道每个教程都表明我不应该使用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)

我正在寻找解决方案和一些关于如何改进算法的建议。

3 个答案:

答案 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);