函数“getline”的隐式声明

Implicit declaration of function 'getline'

提问人:Suhas Omkar 提问时间:6/23/2023 最后编辑:chux - Reinstate MonicaSuhas Omkar 更新时间:6/23/2023 访问量:105

问:

/文件复制:编写 C 程序以使用文件操作复制文件/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {
    FILE* fin, *fout;
    fin = fopen("text.txt","r");
    fout = fopen("write.txt","w+");
    if(NULL == fin) {
        printf("FILE not found!\n");
    }
    else {
        size_t maxlen = 100;
        char* ptr = (char*)calloc(maxlen, sizeof(char));
        // ssize_t getline(char **lineptr, size_t *n, FILE *stream);
        while(getline(&ptr,&maxlen,fin) != -1) {
            fprintf(fout,"%s",ptr);
        }
        free(ptr);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}

我在 vscode 编译器中使用函数,但它给出错误,如下所述 -getline()

警告:函数“getline”的隐式声明 [-Wimplicit-function-declaration] 20 |
while(getline(&ptr,&maxlen,fin) != -1){

C 文件处理 getline

评论

0赞 Andrew Henle 6/23/2023
什么操作系统?什么编译器?请参阅 stackoverflow.com/questions/59014090/...这可能是该问题的重复。
0赞 alexisrdt 6/23/2023
看看这个 en.cppreference.com/w/c/experimental/dynamic/getline
1赞 Suhas Omkar 6/23/2023
我正在使用 Windows 操作系统和 Visual Studio Code

答:

3赞 chux - Reinstate Monica 6/23/2023 #1

getline()不是标准 C 库的一部分。

在编译并遵守 C 标准时,由于函数缺少原型,因此会出现类似“隐式声明函数'getline'”的警告。

也:

  • 请勿使用 .1) 使用标准 C 库 I/O 重新编码或 2) 编写自己的 . 源代码并不难找到。getline()getline()getline()

  • 启用编译器选项以使用该扩展函数(如果存在)。(我不希望 Visual Studio Code 拥有它。


使用普通型,无需预先分配getline()

        // size_t maxlen = 100;
        // char* ptr = (char*)calloc(maxlen, sizeof(char));
        size_t maxlen = 0;
        char* ptr = NULL;
        while(getline(&ptr,&maxlen,fin) != -1) {
            fprintf(fout,"%s",ptr);
        }

由于 OP 的目标是编写一个 C 程序来使用文件操作复制文件,因此更好的方法是以二进制模式打开文件并使用 .该方法假定文件缺少嵌入的 null 字符、可预测的行结尾和其他文本属性。fread()/fwrite()getline()/fprintf()

// Sample unchecked code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
  const char *ifilename = "text.txt";
  FILE *fin = fopen(ifilename, "rb");
  if (fin == NULL) {
    fprintf(stderr, "Unable to open \"%s\" for reading.\n", ifilename);
    return EXIT_FAILURE;
  }
  const char *ofilename = "write.txt";
  FILE *fout = fopen(ofilename, "wb");
  if (fout == NULL) {
    fprintf(stderr, "Unable to open \"%s\" for writing.\n", ofilename);
    return EXIT_FAILURE;
  }

  unsigned char buf[BUFSIZ];
  size_t n_read;
  while ((n_read = fread(buf, 1, BUFSIZ, fin)) > 0) {
    size_t n_written = fwrite(buf, 1, n_read, fout);
    if (n_written != n_read) {
      fprintf(stderr, "Failed writing to \"%s\".\n", ofilename);
      return EXIT_FAILURE;
    }
  }
  
  fclose(fout);
  if (ferror(fin)) {
    fprintf(stderr, "Failed reading from \"%s\".n", ifilename);
    return EXIT_FAILURE;
  }
  fclose(fin);
  return EXIT_SUCCESS;
}

评论

0赞 chux - Reinstate Monica 6/23/2023
@SuhasOmkar 请查看 当有人回答我的问题时,我该怎么办?