如何从文件中读取一行?

时间:2008-11-13 02:51:13

标签: c file-io

我必须读取一个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使用一系列条件,但这看起来很丑陋且不太聪明 我不能使用数组,因为如果数字有两位数,行的大小可能会有所不同。

8 个答案:

答案 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指针