Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取文本文件后拆分/解析字符串?_C - Fatal编程技术网

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

C 读取文本文件后拆分/解析字符串?,c,C,我试图简单地读入一个基本的文本文件,将每一行分割成单独的字符串,然后重新排列/复制到一个新的文本文件中。有没有简单的方法来分割和识别这些字符串,以便在处理行结束时添加到新文件中 到目前为止,我的代码是: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *pFileCust fPointer = fopen("Athletes.txt",

我试图简单地读入一个基本的文本文件,将每一行分割成单独的字符串,然后重新排列/复制到一个新的文本文件中。有没有简单的方法来分割和识别这些字符串,以便在处理行结束时添加到新文件中

到目前为止,我的代码是:

#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;
}
我试图实现的示例输出

Tennis 88888 John Doe
Softball 99999 Jane Smith

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

/* 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
函数了。

这里是对代码的简单修改,它(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;
}
#包括
#包括
#包括
int main()
{
文件*pFileCust=fopen(“运动员.txt”,“r”);
char first_name[100],last_name[100],sport[100];
int-id;
while(fscanf(pFileCust,“%d%s%s%s”、&id、名、姓、运动)!=EOF){
printf(“%s%d%s%s\n”,运动,id,名字,姓氏);
}
fclose(pFileCust);
返回0;
}

你的应用程序缺少的一个关键的东西是为你的变量赋值;您的fscanf没有做任何事情(即使它已经编译)。fscanf不是解析文本的好方法,它不是很健壮。但是对于理解变量是如何分配的原则,请仔细看一下,特别是理解为什么id前面有一个符号和。另外,请确保您理解我为什么同时使用名和姓。

您的问题是什么?虽然这都是可能的,但可能您使用了错误的语言。如果您使用Python或Perl,这将是一项微不足道的任务。例如,使用awk的解决方案是:
awk'{print$4,$1,$2,$3}'
sorry zerkms我编辑了这篇文章!考虑重构FEOF检查。这里发生了很多奇怪的事情
fPointer
未定义,您可能希望使用
pFileCust
fscanf
应该将文件句柄作为第一个参数,然后是格式,然后是变量
fprintf
应该是
STDOUT
。您的变量需要在
fscanf
之前定义。最后,
name
sport
在您的示例中不是整数,但您使用的是
int
类型。
fscanf(pFileCust,“%d%99s%99s%99s”,…)==4
将更加健壮。
#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;
}