如何在C中循环到文本文件的末尾

问题描述 投票:0回答:1

对于分配,我正在重新创建getline函数(名为check),该函数检查换行符,如果仍在读取文件,则返回1,当文件读取完成时,返回0。我已经能够打印出文本文件的第一行。我该如何循环执行我的函数(检查),使其读取到文件末尾。而不只是一行。

这是我的检查功能

 int check(int fd, char **line)
 { 
    static char buff[32];
    read(fd,buff,32);
    int i =0;
    int cnt = 0;
    while(buff[cnt] != '\n' && buff[cnt] != '\0')
        cnt ++;
    char *  arr = (char*) malloc(sizeof(char)*cnt);
    while(buff[i] != '\n' && buff[i] != '\0')
    {
        arr[i] = buff[i];
        i++;
    }
    arr[i] = '\0';
    *line = strdup(arr);
    if(arr[i] == '\0')
        return 1;
    return 0;
    }

我的主要功能是从终端读取:

 int main(int argc,char **argv)
{
int fd;
char *sen;
char *line;
fd = open(argv[argc-1],O_RDONLY);
if (check(fd,&line)==1)
    printf("%s",line); 

return (0);
}

我看过类似的东西:

while(read> 0)

但是我不知道该如何应用

c fgets getline file-manipulation
1个回答
0
投票

代码应使用read()的返回值,而不是不能在32内结束的循环。

ssize_t cnt = read(fd,buff,32);
//int cnt = 0;
//while(buff[cnt] != '\n' && buff[cnt] != '\0')
//    cnt ++;

我见过类似的内容:while(read>0),但我不知道如何应用此内容

read(fd,buff,32);尝试读取32个字符,即使line短得多。


相反,代码可以读到直到

  • 找到新行
  • 文件结尾

最直接的方法是使用fget(),但我们可以假定不允许这样做。

一种效率低下但又说明性的方法一次只能读取一个字符。

int check(int fd, char **line) {
  int ch;
  size_t count = 0;
  char *dest = NULL;

  while ((ch = getchar()) != EOF) {
    // append `ch` to `dest` in an ever increasing allocation location
    char *s = realloc(dest, size + 2);  
    if (s == NULL) {
      // Handle out of memory, left for OP to code
    }
    dest[size++] = ch;
    if (ch == '\n') break;
  }

  if (size == 0) {
    // Nothing read
    return 0;
  }

  dest[size] = '\0'; //append null character to form string
  return dest
}
© www.soinside.com 2019 - 2024. All rights reserved.