如何从此文本列表中获取第一行?
How to take first row from this list of text?
我有一个包含文本的列列表,但我只是从该列表中获取第一行。怎么做?
#include <stdio.h>
int main()
{
FILE *fr;
char c;
fr = fopen("prog.txt", "r");
while( c != EOF)
{
c = fgetc(fr); /* read from file*/
printf("%c",c); /* display on screen*/
}
fclose(fr);
return 0;
}
你的停止条件是EOF
,所有内容都会读到文件末尾,你需要的是一直读到找到换行符,此外EOF
(-1
) 应该与 int
类型进行比较。
你需要这样的东西:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fr;
int c;
if(!(fr = fopen("prog.txt", "r"))){ //check file opening
perror("File error");
return EXIT_FAILURE;
}
while ((c = fgetc(fr)) != EOF && c != '\n')
{
printf("%c",c); /* display on screen*/
}
fclose(fr);
return EXIT_SUCCESS;
}
这是尊重您阅读 char
行 char
的代码,您还拥有允许您阅读整行的库函数,例如 fgets()
用于便携式代码,or getline()
if you are not on Windows, alternatively download a portable version, and, of course you can make your own like this one or this one.
只需将 EOF 替换为 '\n'(新行字符)。比您的代码将读取直到到达新行。这是它的样子:
#include <stdio.h>
int main()
{
FILE *fr;
char c = ' ';
fr = fopen("prog.txt", "r");
while(c != EOF && c != '\n')
{
c = fgetc(fr); /* read from file*/
if(c != EOF){
printf("%c",c); /* display on screen*/
}
}
fclose(fr);
return 0;
}
我还没有测试过,但可能有效。如果代码有问题,请告诉我,我将对其进行编辑。
Edit1:char c;第 5 行初始化为 ' ',用于处理 UB。
Edit2:在第 7 行的 while 循环中添加条件 (c != EOF),不给出无限循环的原因。
Edit3:将 if 语句添加到第 10 行以不打印 EOF,这可能是导致奇怪结果的原因。
无论如何,这里有一个使用 getline
的示例
#include <stdio.h>
int main()
{
FILE *fr;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (!(fr = fopen("prog.txt", "r"))) {
perror("Unable to open file");
return 1;
}
nread = getline(&line, &len, fr);
printf("line: %s, nread: %ld\n", line, nread);
fclose(fr);
return 0;
}
一些注意事项:
getline()
可以根据需要自动分配您的读取缓冲区。
getline()
returns 行尾分隔符。如果你不想要它,你可以随时将其剥离。
- 始终检查 I/O 调用的状态是个好主意,例如 "fopen()"。
我有一个包含文本的列列表,但我只是从该列表中获取第一行。怎么做?
#include <stdio.h>
int main()
{
FILE *fr;
char c;
fr = fopen("prog.txt", "r");
while( c != EOF)
{
c = fgetc(fr); /* read from file*/
printf("%c",c); /* display on screen*/
}
fclose(fr);
return 0;
}
你的停止条件是EOF
,所有内容都会读到文件末尾,你需要的是一直读到找到换行符,此外EOF
(-1
) 应该与 int
类型进行比较。
你需要这样的东西:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fr;
int c;
if(!(fr = fopen("prog.txt", "r"))){ //check file opening
perror("File error");
return EXIT_FAILURE;
}
while ((c = fgetc(fr)) != EOF && c != '\n')
{
printf("%c",c); /* display on screen*/
}
fclose(fr);
return EXIT_SUCCESS;
}
这是尊重您阅读 char
行 char
的代码,您还拥有允许您阅读整行的库函数,例如 fgets()
用于便携式代码,or getline()
if you are not on Windows, alternatively download a portable version, and, of course you can make your own like this one or this one.
只需将 EOF 替换为 '\n'(新行字符)。比您的代码将读取直到到达新行。这是它的样子:
#include <stdio.h>
int main()
{
FILE *fr;
char c = ' ';
fr = fopen("prog.txt", "r");
while(c != EOF && c != '\n')
{
c = fgetc(fr); /* read from file*/
if(c != EOF){
printf("%c",c); /* display on screen*/
}
}
fclose(fr);
return 0;
}
我还没有测试过,但可能有效。如果代码有问题,请告诉我,我将对其进行编辑。
Edit1:char c;第 5 行初始化为 ' ',用于处理 UB。
Edit2:在第 7 行的 while 循环中添加条件 (c != EOF),不给出无限循环的原因。
Edit3:将 if 语句添加到第 10 行以不打印 EOF,这可能是导致奇怪结果的原因。
无论如何,这里有一个使用 getline
的示例#include <stdio.h>
int main()
{
FILE *fr;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (!(fr = fopen("prog.txt", "r"))) {
perror("Unable to open file");
return 1;
}
nread = getline(&line, &len, fr);
printf("line: %s, nread: %ld\n", line, nread);
fclose(fr);
return 0;
}
一些注意事项:
getline()
可以根据需要自动分配您的读取缓冲区。getline()
returns 行尾分隔符。如果你不想要它,你可以随时将其剥离。- 始终检查 I/O 调用的状态是个好主意,例如 "fopen()"。