【问题标题】:Reading a line from a file and storing it in variables从文件中读取一行并将其存储在变量中
【发布时间】:2017-11-05 10:36:12
【问题描述】:

我有一个包含 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 个“项目”组成,我想存储在不同的变量中,我怎样才能有效地做到这一点?

【问题讨论】:

  • 你为什么使用open()?为什么不使用fopen()fgets() 获取输入行,并使用sscanf() 解析该行?
  • 对不起。我不明白您想将整数放入文件中的整数变量、char* 中的字符串和 char 中的字符?这是你的意思吗?
  • @DavidBowling 你能给我一个问题中的代码示例吗?
  • 您是否正在尝试读取以只写模式打开的文件?还是我错过了什么?

标签: c file unix


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2020-02-09
    • 2019-04-21
    • 2015-06-03
    • 1970-01-01
    • 2012-07-17
    • 2020-03-26
    相关资源
    最近更新 更多