fopen("./hello.txt", "r");
打开并缓冲名为“./hello.txt”的文件以供读取。
除非你的文件确实是以./
(不是/
文件名在 UNIX 等中非法?),你应该去除./
来自您作为文件名传递的字符串文字。
编译错误在您发布的“原始”代码中是:
-
getline()
不可能真的是重新定义如果你包括stdio.h
在某些平台上,例如 MacOS,因为它在那里定义/声明为:
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream)
基本上,rename getline()
对于一些微不足道的东西,比如getln()
.
或者,通过添加-stdC99
编译期间参数的选项。
This seems至少在 C 中是非标准的,也许在 C++ 中不是,但这就是 MacOS 上的情况stdio.h
.
To be precise,版本 10.14.6,第 359 行/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h
- A missing
;
after ++i
@第 50 行第 12 栏。
此外,与 C 等语言中的大多数 I/O 一样,您的程序是缺少一些基本的错误检查- 非常重要,例如,检查fp == NULL
以防万一fopen()
失败,例如如果 hello.txt 不存在,就会发生这种情况,这会很糟糕,因为fclose(NULL)
是一个段错误。
当您学习 C 中的(流级)文件 I/O 时,也许随后您就会理解这一点。
如果你还没有达到学习的水平stdio.h
基于文件 I/O 还没有,为什么不直接使用更方便的功能从控制台重定向输入?
做就是了hello.txt > ./yourprogram
or hello.txt | ./yourprogram
从终端运行原始教科书代码时。
适用于基于 UNIX 的系统,甚至 Windows 和 DOS,并且通常用于不值得直接实现文件 I/O 的痛苦的情况。