我必须读取一个txt文件,其中的行格式如下:
1: (G, 2), (F, 3) 2: (G, 2), (F, 3) 3: (F, 4), (G, 5) 4: (F, 4), (G, 5) 5: (F, 6), (c, w) 6: (p, f), (G, 7) 7: (G, 7), (G, 7) w: (c, w), (c, w)
每一行都会为一个结构提供数据(其中包含5个数字或字母)
读取线条并获得我想要的字符串的最佳方法是什么?
我目前正在使用fgetc
使用一系列条件,但这看起来很丑陋且不太聪明
我不能使用数组,因为如果数字有两位数,行的大小可能会有所不同。
答案 0 :(得分:6)
我认为你可以按照以下方式解析它:
fscanf(file,"%c: (%c, %c), (%c, %c)", &first,&second,&third,&fourth,&fifth);
答案 1 :(得分:3)
使用fgets()
:
#include <stdio.h>
int main(void)
{
char line[256];
while(fgets(line, sizeof(line), stdin) != NULL) // fgets returns NULL on EOF
{
// process line; line is guaranteed to be null-terminated, but it might not end in a
// newline character '\n' if the line was longer than the buffer size (in this case,
// 256 characters)
}
return 0;
}
答案 2 :(得分:3)
#include <stdio.h>
int main (void)
{
char buf[81]; /* Support lines up to 80 characters */
char parts[5][11]; /* Support up to 10 characters in each part */
while (fgets(buf, sizeof(buf), stdin) != NULL)
{
if (sscanf(buf, "%10[^:]: (%10[^,], %10[^)]), (%10[^,], %10[^)])",
parts[0], parts[1], parts[2], parts[3], parts[4]) == 5)
{
printf("parts: %s, %s, %s, %s, %s\n",
parts[0], parts[1], parts[2], parts[3], parts[4]);
}
else
{
printf("Invalid input: %s", buf);
}
}
return 0;
}
示例运行:
$ ./test
1: (G, 2), (F, 3)
2: (G, 2), (F, 3)
3: (F, 4), (G, 5)
4: (F, 4), (G, 5)
5: (F, 6), (c, w)
6: (p, f), (G, 7)
7: (G, 7), (G, 7)
w: (c, w), (c, w)
parts: 1, G, 2, F, 3
parts: 2, G, 2, F, 3
parts: 3, F, 4, G, 5
parts: 4, F, 4, G, 5
parts: 5, F, 6, c, w
parts: 6, p, f, G, 7
parts: 7, G, 7, G, 7
parts: w, c, w, c, w
如果输入中的最后一个值超过10个字符,它将被截断而没有错误指示,如果这是不可接受的,您可以使用%c
转换说明符作为第六个参数来捕获下一个字符在最后一个值之后,确保它是一个右括号。
答案 3 :(得分:0)
fgets()和sscanf()
答案 4 :(得分:0)
fscanf非常好用,但你必须使用字符串转换,因为字符不适用于多个数字的数字。
这不是某种功课吗?
#include <stdio.h>
void main(int argc, char **argv) {
FILE * f;
f = fopen(argv[1], "r");
while (1) {
char char_or_num[32][5]; // five string arrays, up to 32 chars
int i;
int did_read;
did_read = fscanf(f, "%32[0-9a-zA-Z]: (%32[0-9a-zA-Z], %32[0-9a-zA-Z]), (%32[0-9a-zA-Z], %32[0-9a-zA-Z])\n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
if (did_read != 5) {
break;
}
printf("%s, %s, %s, %s, %s\n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
}
fclose(f);
}
答案 5 :(得分:0)
#include void f() { FILE* fp; if ( (fp = fopen("foo.txt", "r")) == NULL) { perror("fopen"); return; } char ch[5]; while (fscanf(fp, "%c: (%c, %c), (%c, %c)\n", &ch[0], &ch[1], &ch[2], &ch[3], &ch[4]) == 5) { printf("--> %c %c %c %c %c\n", ch[0], ch[1], ch[2], ch[3], ch[4]); } fclose(fp); }
答案 6 :(得分:0)
基本上你必须通过fgetpos保存文件ptr的位置,走到行尾(不过你定义它),保存那个大小,fsetpos到前一个位置,分配一个足够大的缓冲区来保存该行,然后使用新缓冲区调用fread。
答案 7 :(得分:0)
假设你有正确的变量,这应该有效:
fscanf(fp, "%[^:]: (%[^,], %[^)]), (%[^,], %[^)])", a, b, c, d, e);
fp是一个文件指针 而“a”到“e”是char指针