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;
}