Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 打印.txt文件的一部分_C_String_File - Fatal编程技术网

C 打印.txt文件的一部分

C 打印.txt文件的一部分,c,string,file,C,String,File,再次向您问好,如果这是重复的话,请提前道歉,但我很绝望,我必须问一下 我正在为一个学校项目用c语言编写一个程序,我几乎完成了,但我被卡住了。 我有一个txt文件,如图所示: 我现在需要做的是打印列出的颜色,但是每种不同的颜色只能打印一次。 汽车制造商也一样,但这是以后的事了 我完全没有主意了。。。任何帮助都将不胜感激……此程序将读取格式与您所示相同的文件,并删除颜色的副本。删除其他重复项的技术相同。我用这样的文件进行测试 4132 RED ALFA ROMERO 2005 1234 BLUE

再次向您问好,如果这是重复的话,请提前道歉,但我很绝望,我必须问一下

我正在为一个学校项目用c语言编写一个程序,我几乎完成了,但我被卡住了。 我有一个txt文件,如图所示:

我现在需要做的是打印列出的颜色,但是每种不同的颜色只能打印一次。 汽车制造商也一样,但这是以后的事了


我完全没有主意了。。。任何帮助都将不胜感激……

此程序将读取格式与您所示相同的文件,并删除颜色的副本。删除其他重复项的技术相同。我用这样的文件进行测试

4132 RED ALFA ROMERO 2005
1234 BLUE FIAT BLAHOGA 2032
4132 RED ALFA ROMERO 2005
1234 ORANGE FIAT BLAHOGA 2032
4132 RED ALFA ROMERO 2005
1234 BLACK FIAT BLAHOGA 2032
1234 ORANGE FIAT BLAHOGA 2032
1234 ORANGE FIAT BLAHOGA 2032
该方案:

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

void rmdup(char *resentence) {
    char *temp1 = malloc(100);
    char *temp = NULL;

    *temp1 = 0;
    temp = strtok(resentence, " ");

    if (temp != NULL) {// && strstr(temp1, temp) == NULL)
        strcpy(temp1, temp);
        while ((temp = strtok(NULL, " ")) != NULL) {
            if (strstr(temp1, temp) == NULL) {
                strcat(temp1, " ");
                strcat(temp1, temp);
            }
        }
    }
    strcpy(resentence, temp1);
    puts(resentence);
    free(temp1);
}

int main(int argc, char *argv[]) {

    ssize_t read;
    char *line = NULL;
    size_t len = 0;
    FILE *fp;

    fp = fopen("file.txt", "r");

    char str[80];
    strcpy(str, "");
    while ((read = getline(&line, &len, fp)) != -1) {
        char * date2 = strtok(line, " ");
        date2 = strtok(NULL, " ");
        strcat(str, strdup(date2));
        strcat(str, " ");
    }
    fclose(fp);

    rmdup(str);
    printf("after: %s", str);

    exit(0);
}

您可以看到输出的只是唯一的颜色

好的,从注释继续,正如注释中所述,对于任何数据处理问题,您需要做的第一件事是将所有数据读入一个表单,以便您可以根据需要使用它。这里有各种类型的数据,它们都构成了一个单元(在本例中为汽车)。当您有不同类型的数据需要作为一个单元处理时,您应该考虑struct。在这里,结构
car
是有意义的:

typedef struct {    /* struct for cars */
    int id;
    char color[MAXN];
    char manf[MAXN];
    int year;
} car;
现在,您可以将数据文件中的每一行读入数组或
struct car
,并使所有数据随时可用于代码的其余部分

当您有数据行时,您应该考虑面向行的输入,例如
fgets
getline
。虽然您可以在这里使用
scanf
系列,但最好一次读取一行,并从读取的每一行解析数据。此外,通常最好将数据解析为临时变量,然后如果验证了所有变量,那么,也只有这样,才能将临时变量复制到结构并增加索引。例如,您可以执行以下操作:

/* constants for max name, chars & structs */
enum { MAXN = 16, MAXC = 64, MAXS = 128 };
...
    car cars[MAXS] = {{ .id = 0 }};                /* array of struct car */
    char buf[MAXC] = "";
    size_t i, j, idx = 0, nc = 0, nm = 0;
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
    ...
    while (idx < MAXS && fgets (buf, MAXC, fp)) {   /* read each line */
        int tid, tyr;                               /* temp variables */
        char tcol[MAXC] = "", tman[MAXC] = "";
        /* separate into temp variables, validate, copy to struct */
        if (sscanf (buf, " %d %s %s %d%*c", &tid, tcol, tman, &tyr) == 4) {
            cars[idx].id = tid;
            snprintf (cars[idx].color, MAXN, "%s", tcol);
            snprintf (cars[idx].manf, MAXN, "%s", tman);
            cars[idx++].year = tyr;
        }
    }
注意:如果制造商没有所有唯一的首字母,则在使用颜色进行类似测试时,需要完整的
strcmp
,而不仅仅是比较首字母

示例输入

after: RED BLUE ORANGE BLACK
$ cat dat/cars.txt
4132 RED ALFA-ROMEO 2005
5230 BLUE FIAT 2004
4321 WHITE NISSAN 2000
5233 BLUE BMW 2001
7300 YELLOW CITROEN 1999
1232 BLUE PEUGEOT 1990
9102 RED VW 1995
1998 YELLOW ALFA-ROMEO 2004
5333 WHITE VW 1999
6434 BLUE NISSAN 2000
8823 BLACK MERCEDES 2003
4556 BLACK SEAT 1997
1554 RED MERCEDES 2001
6903 YELLOW NISSAN 2000
7093 BLACK FIAT 1978
1023 WHITE VW 1998
3422 BLUE SEAT 2005
3555 RED BMW 2004
6770 YELLOW SEAT 2002
$ ./bin/cars <dat/cars.txt
4132  RED     ALFA-ROMEO 2005
5230  BLUE    FIAT       2004
4321  WHITE   NISSAN     2000
5233  BLUE    BMW        2001
7300  YELLOW  CITROEN    1999
1232  BLUE    PEUGEOT    1990
9102  RED     VW         1995
1998  YELLOW  ALFA-ROMEO 2004
5333  WHITE   VW         1999
6434  BLUE    NISSAN     2000
8823  BLACK   MERCEDES   2003
4556  BLACK   SEAT       1997
1554  RED     MERCEDES   2001
6903  YELLOW  NISSAN     2000
7093  BLACK   FIAT       1978
1023  WHITE   VW         1998
3422  BLUE    SEAT       2005
3555  RED     BMW        2004
6770  YELLOW  SEAT       2002

RED
BLUE
WHITE
YELLOW
BLACK

ALFA-ROMEO
FIAT
NISSAN
BMW
CITROEN
PEUGEOT
VW
MERCEDES
SEAT
$ ./bin/cars2 <dat/cars.txt
4132  RED     ALFA-ROMEO 2005
5230  BLUE    FIAT       2004
4321  WHITE   NISSAN     2000
7300  YELLOW  CITROEN    1999
8823  BLACK   MERCEDES   2003
示例使用/输出

after: RED BLUE ORANGE BLACK
$ cat dat/cars.txt
4132 RED ALFA-ROMEO 2005
5230 BLUE FIAT 2004
4321 WHITE NISSAN 2000
5233 BLUE BMW 2001
7300 YELLOW CITROEN 1999
1232 BLUE PEUGEOT 1990
9102 RED VW 1995
1998 YELLOW ALFA-ROMEO 2004
5333 WHITE VW 1999
6434 BLUE NISSAN 2000
8823 BLACK MERCEDES 2003
4556 BLACK SEAT 1997
1554 RED MERCEDES 2001
6903 YELLOW NISSAN 2000
7093 BLACK FIAT 1978
1023 WHITE VW 1998
3422 BLUE SEAT 2005
3555 RED BMW 2004
6770 YELLOW SEAT 2002
$ ./bin/cars <dat/cars.txt
4132  RED     ALFA-ROMEO 2005
5230  BLUE    FIAT       2004
4321  WHITE   NISSAN     2000
5233  BLUE    BMW        2001
7300  YELLOW  CITROEN    1999
1232  BLUE    PEUGEOT    1990
9102  RED     VW         1995
1998  YELLOW  ALFA-ROMEO 2004
5333  WHITE   VW         1999
6434  BLUE    NISSAN     2000
8823  BLACK   MERCEDES   2003
4556  BLACK   SEAT       1997
1554  RED     MERCEDES   2001
6903  YELLOW  NISSAN     2000
7093  BLACK   FIAT       1978
1023  WHITE   VW         1998
3422  BLUE    SEAT       2005
3555  RED     BMW        2004
6770  YELLOW  SEAT       2002

RED
BLUE
WHITE
YELLOW
BLACK

ALFA-ROMEO
FIAT
NISSAN
BMW
CITROEN
PEUGEOT
VW
MERCEDES
SEAT
$ ./bin/cars2 <dat/cars.txt
4132  RED     ALFA-ROMEO 2005
5230  BLUE    FIAT       2004
4321  WHITE   NISSAN     2000
7300  YELLOW  CITROEN    1999
8823  BLACK   MERCEDES   2003

$./bin/cars将所有值读取到一个结构数组中,然后为颜色和制造商创建单独的指针数组,指向结构数组中每个元素的唯一引用,并打印出来。我理解你的意思,但我不知道如何创建指针数组。。。如果你能再帮我一点忙,我将永远感激你@大卫·C·兰基尼马上就给你一个短暂的机会。你将是我的救世主@DavidC.Rankin请不要忘记我:(非常感谢你在这方面所做的努力,但我恐怕我在下面几个层次……我几乎无法理解其中的一半。我确实在使用一个struct,尽管它中的所有数组都是char类型。我尝试使用strok()获取txt中每一行的颜色部分)witch可以很好地以更有组织的方式打印文件,但出于某种原因,使用带有颜色的字符串数组是一个问题……然后使用我使用的结构数组,我尝试了相同的方法,使用2 for循环,我尝试只打印一种以前未打印过的颜色。使用一些调试printf,我可以看到字符串填充正确,但出于某种原因,它会在for循环中打印随机符号……哦,对不起,你理解struct的数组了吗?如果是这样,你就完成了最难的部分。指针数组将只填充前X个元素,其中X是唯一颜色/制造商的数量。指针数组就是一个列指针的选择(例如
颜色[0],颜色[1]等…
在每种情况下,它们都指向结构数组中第一个出现的颜色或制造商。如果您查看
颜色[4]
(黑色)的地址,您将看到它指向与
汽车[10]相同的地址。颜色
(第一个黑色)。可以将struct数组与all
char[]一起使用
成员,将数字视为数字似乎更为自然。如果您查看
sscanf
调用,这与使用
strtok
做的事情是一样的。
sscanf
方法更为直接。不管怎样,目标是在结构数组中获取值。您可以找到唯一的颜色/man不管你选择哪种方式,我只是在结构数组上循环,选择每个数组的第一个匹配项,然后跳过其余的。如果(!nc)
只是选择第一个颜色(在那一点上不可能有任何重复)。即使你的代码对我来说有点高级(我的老师会非常怀疑)你最后的两条评论让我找到了正确的方向。再次感谢你的努力!!