读取文本文件后拆分/解析字符串?

时间:2017-09-13 23:58:24

标签: c

我试图简单地读取一个基本的文本文件,将每一行拆分成单独的字符串,并将它们重新排列/复制到一个新的文本文件中。是否有任何简单的方法来分割和识别这些字符串,以便在处理行结束时添加到新文件中?

到目前为止我的代码:

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

int main()
{
    FILE *pFileCust
    fPointer = fopen("Athletes.txt", "r");
    char singleLine[150];

    while (!feof(pFileCust)){
        fscanf(singleLine, 150);
        int id, name, sport;
        fprintf(%d[0,6], %s[8,15], %s[16,22], id, name, sport);
    }

    fclose(fPointer);
    return 0;
}

示例文本要读入程序的文件:

88888 John Doe Tennis
99999 Jane Smith Softball

我想要实现的输出示例。

Tennis 88888 John Doe
Softball 99999 Jane Smith

2 个答案:

答案 0 :(得分:0)

文件中的每一行都对应一条记录。每个连续的非空白字符系列对应于当前记录中的字段。因此,

/* getrecord: read next record on fp */
char *getrecord(FILE *fp)
{
    assert(fp);

    char *line = malloc(MAXLINE);
    if (line != NULL)
        if (fgets(line, MAXLINE, fp) != NULL)
            return line;

    return NULL;
}

/* getfield: read next field in record */
char *getfield(const char *record, int *pos)
{
    assert(record && pos);

    char *record;
    int ret;

    if ((record = malloc(MAXRECORD)) != NULL) {
        ret = sscanf(record + *pos, "%s", record);
        if (ret == 1)
            return record;
    }
    return NULL;
}

虽然每个功能似乎都没有做太多工作,但将业务逻辑与记录/字段读取分开具有实际的好处。它允许可扩展性(例如,您可以为这些例程添加错误处理)。您还可以更好地理解代码。现在您可以编写将使用这对调用的main函数。

答案 1 :(得分:0)

以下是对(a)编译的代码的简单修改,以及(b)生成所需的输出。

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

int main()
{
  FILE *pFileCust = fopen("Athletes.txt", "r");
  char first_name[100], last_name[100], sport[100];
  int id;

  while (fscanf(pFileCust, "%d %s %s %s", &id, first_name, last_name, sport) != EOF) {
    printf("%s %d %s %s\n", sport, id, first_name, last_name);

  }

  fclose(pFileCust);
  return 0;
}

你的应用程序缺少的一个关键事项是为变量赋值的任何事情;你的fscanf没有做任何事情(如果它甚至编译)。 fscanf不是解析文本的好方法,它不是很强大。但是对于理解变量如何分配的原则,请仔细查看,特别要理解为什么id前面有一个&符号。另外,请确保您了解我使用名字和姓氏的原因。