我有一个由多行组成的文件。在每一行中都有几个简短的单词。有没有办法用scanf读取它们并能够确定新行何时开始?我可以读取整行,然后拆分它,但问题是我不知道线条有多大,所以我不能创建固定大小的缓冲区。我想分别阅读每个单词。
答案 0 :(得分:1)
如果你有POSIX,你可以解决这个问题,不是通过抽象,而是通过up to getline()
。
它基本上是fgets()
,通过动态分配它来处理任何长度的输入行。
答案 1 :(得分:1)
我想不出这样做的标准方法,所以我实现了自己的函数来读取字符串。函数scan(s)
返回EOF
,NEW LINE
或NO NEW LINE
。这是代码:
#include <stdio.h>
#include <stdlib.h>
#define NEW_LINE 1
#define NO_NEW_LINE 0
#define MY_EOF -1
int scan(char *s) {
int c = getchar(), idx = 0;
while(c == ' ' || c == '\n') c = getchar();
if(c == EOF) return MY_EOF;
s[idx++] = c;
while(c != ' ') {
c = getchar();
if(c == EOF) {
s[idx] = '\0';
return MY_EOF;
} else if(c == '\n') {
s[idx] = '\0';
return NEW_LINE;
} else s[idx++] = c;
}
s[idx] = '\0';
return NO_NEW_LINE;
}
int main() {
freopen("input.txt", "r", stdin);
char s[500];
int type;
do {
type = scan(s);
puts(s);
if(type == NEW_LINE) printf("<New Line>\n");
fflush(stdout);
} while(type != MY_EOF);
return 0;
}
<强> input.txt中强>
1| hello world one two
2| three four
3| a man a plan a canal panama
4| race car
5| blah blah
<强>标准输出强>
1| hello
2| world
3| one
4| two
5| <New Line>
6| three
7| four
8| <New Line>
9| a
10| man
11| a
12| plan
13| a
14| canal
15| panama
16| <New Line>
17| race
18| car
19| <New Line>
20| blah
21| blah
我希望这会有所帮助:)