从文件中读取一行并将其存储在变量

时间:2017-06-04 15:22:35

标签: c file unix

我有一个包含2-3行的文件,每行我想存储在一个char *变量中,然后将其翻译并存储到其他适当的变量中。

不是在unix中,只是在c中,有一个fscanf(%d,%s,%s,1,2,3);就是这样,但在unix中它有点奇怪。

例如:a abc 12 12

将它存储在char msg [20]中,然后msg [20]将存储在4个变量中,一个char,一个char *和两个整数。怎么办呢?

这是我到目前为止所得到的:

int ret_in, in1,file;
char buffer1[BUF_SIZE];
int i =0;

    char fn[5] = "file";

      char msg[20];
     file = open(fn,O_WRONLY|O_CREAT,0644);
     //msg = "test";

    while(((ret_in = read (file, &buffer1, BUF_SIZE)) > 0))
      {
       for(i; i<ret_in; i++)
        {
         if(buffer1[i]!='\n')
          msg[i] = buffer1[i];
        }
    }
    printf("%s", msg); //TEST: check msg
    close(file);

它在msg变量中存储得很好,但是如果它由4个&#39;项组成。我想存储不同的变量,我该如何有效地做到?

1 个答案:

答案 0 :(得分:1)

您可以使用fopen()打开文件并获取指向文件流的指针。可以将此指针传递给fgets()以从文件中检索行并将它们存储在缓冲区中。然后可以使用sscanf()解析此缓冲区。

这是一个如何工作的例子。请注意,这里我使用数组来存储每行的字段组件;你可能有不同的要求。

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINES  100

int main(void)
{
    FILE *fp = fopen("my_file.txt", "r");
    if (fp == NULL) {
        perror("Unable to open file");
        exit(EXIT_FAILURE);
    }

    char buffer[1000];
    char id[MAX_LINES];
    char msg[MAX_LINES][10];
    int val_a[MAX_LINES];
    int val_b[MAX_LINES];
    size_t lines = 0;

    while (fgets(buffer, sizeof buffer, fp) != NULL) {
        if (sscanf(buffer, "%c%9s%d%d",
                   &id[lines], msg[lines], &val_a[lines], &val_b[lines]) == 4) {
            ++lines;
        }
    }

    for (size_t i = 0; i < lines; i++) {
        printf("Line %zu: %c -- %s -- %d -- %d\n",
               i+1, id[i], msg[i], val_a[i], val_b[i]);
    }

    fclose(fp);

    return 0;
}

使用此文本文件作为输入:

A abc 12 34
B def 24 68
C ghi 35 79

给出以下输出:

Line 1: A -- abc -- 12 -- 34
Line 2: B -- def -- 24 -- 68
Line 3: C -- ghi -- 35 -- 79