Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_File_Struct - Fatal编程技术网

C 将文件读入结构

C 将文件读入结构,c,arrays,file,struct,C,Arrays,File,Struct,我正在尝试编写一个代码来读取一个文本文件并将其存储到一个struct中,这样我就可以在程序中使用struct了 struct同义词{ char Ausdruck[100]; char Anmerkung[60]; }; typedef结构同义词; 这是我的结构,我正在尝试适合这样的文件 #许可证以及此库;如果没有,请写信给自由软件 基金会,51,富兰克林ST,第五楼,波士顿,美国02110-1301 核裂变;裂变;克恩斯帕尔顿;阿托姆斯帕尔东; 韦德劳夫纳姆;福特龙; 韦格法伦;韦格里根;阿布

我正在尝试编写一个代码来读取一个文本文件并将其存储到一个struct中,这样我就可以在程序中使用struct了

struct同义词{
char Ausdruck[100];
char Anmerkung[60];
};
typedef结构同义词;
这是我的结构,我正在尝试适合这样的文件

#许可证以及此库;如果没有,请写信给自由软件
基金会,51,富兰克林ST,第五楼,波士顿,美国02110-1301
核裂变;裂变;克恩斯帕尔顿;阿托姆斯帕尔东;
韦德劳夫纳姆;福特龙;
韦格法伦;韦格里根;阿布弗利根;奥夫布雷肯;阿卜法伦;阿卜杜森(ugs.);达文法伦;福特法伦;阿布雷森;
培训;库尔斯人;工作坊;维特教养;研讨会;库苏斯;教化;莱尔冈;
泽勒贡;拆卸;恩特拉松;阿巴;
应删除
#
后面的行。
Ausdruck
中的每个单词以及后面()中的一个单词都应保存在
Anmerkung
中。 问题是我需要像每一行一样也是结构化的,因为在整个程序中,我需要能够从中选择一行和两个单词作为一个刽子手游戏

#包括
#包括
#包括
#包括
结构电子标签{
char Ausdruck[100][20];
char Anmerkung[100][20];;
};
类型定义结构Eintrag Eintrag;
int zeilencount(){
int count_line=0;
char-chr;
文件*datei=fopen(“wort.txt”、“r”);
if(datei==NULL){
printf(“Fehlgeschlagen\n”);
}
chr=getc(datei);
while(chr!=EOF)
{
//每当遇到新行时计数
如果(chr=='\n')
{
计数行=计数行+1;
}
如果(chr='#'){
计数行=计数行-1;
}
//从文件中提取下一个字符。
chr=getc(datei);
}
fclose(datei);
计数行++;
返回计数行;
}
int main(){
int i,w,z,k;//循环索引
//福彭
int anzahlzeile=zeilencount();
Eintrag Eintrag[anzahlzeile];
文件*datei=fopen(“wort.txt”、“r”);
if(datei==NULL){
printf(“Fehlgeschlagen\n”);
}

对于(i=0;i来说,准确地说出您想要做什么有点困难,但是如果我理解正确,您希望读取您发布的数据文件,忽略以
'#'
开头的行,将剩余的行读入
同义词[X]。Austruck
,以及该行是否包含
(内容)
,将
'stuff'
读入
同义词[X]。anmerkung
。如果这不是您想要的,请澄清,我很乐意进一步提供帮助。(注意:在C中,变量传统上是小写的,我在下面使用小写)

要实现上述内容,您只需要一个结构数组。您的
Zeile
除了声明15
同义词之外,似乎没有任何用途(如果不是这样,请进一步解释)。要读取和分析每一行,您只需要为
同义词
的每个成员创建两个大小足够的字符数组。下面,我们创建了一个大小为
MAXS
(256)的
同义词
静态数组。(您可以根据需要动态分配和
realloc
,以处理未知数量的行,但出于示例目的,我们将使用简单的静态声明)

fgets
用于读取每一行。一个简单的辅助函数
str_rmcrlf
从读取的每一个字符串的末尾修剪
换行符
,并返回其长度。每一行不是以
“#”开头的
复制到
同义词[idx]。ausdruck
strchr
用于检查每一行的
('
。如果找到,
(…)
的内容将解析为
sbuf
。如果转换成功,
sbuf
将复制到
同义词[idx]。anmerkung

尝试一下,如果您的要求与描述的不同,请告诉我

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

#define MAXS 256
#define MAXC 128
#define MAXW 64

typedef struct {
    char ausdruck[MAXC];
    char anmerkung[MAXW];
} synonym;

ssize_t str_rmcrlf (char *str);

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

    char buf[MAXC] = {0};
    synonym synonym[MAXS] = {{{0},{0}}};
    size_t i, idx = 0;
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* read each line in file until MAXS synonym elements filled */
    while (idx < MAXS && fgets (buf, MAXC, fp))
    {
        if (*buf == '#') continue;          /* skip beginning with '#'  */

        char sbuf[MAXW] = {0};
        char *p = NULL;
        ssize_t len = 0;

        if ((len = str_rmcrlf (buf)) == -1) /* strip crlf, get length   */
            continue;                       /* continue on error        */

        /* (you should check for short-read here) */

        strcpy (synonym[idx].ausdruck, buf);    /* copy buf to ausdruck */

        /* parse buf in anmerkung */
        if ((p = strchr (buf, '('))) {          /* check buf for '('    */
            if (sscanf (p, "(%[^)\n]", sbuf))           /* read "(...)" */
                strcpy (synonym[idx].anmerkung, sbuf);  /* copy "..."   */
        }

        idx++;
    }

    for (i = 0; i < idx; i++) {
        printf ("\n  synonym[%3zu].ausdruck  : %s\n", i, synonym[i].ausdruck);
        if (*(synonym[i].anmerkung))
            printf ("  synonym[%3zu].anmerkung : (%s)\n", i, 
                    synonym[i].anmerkung);
        else
            printf ("  synonym[%3zu].anmerkung :\n", i);
    }

    return 0;
}

/** stip trailing newlines and carraige returns by overwriting with
 *  null-terminating char. str is modified in place. The new length
 *  is retured on success, -1 otherwise.
 */
ssize_t str_rmcrlf (char *str)
{
    if (!str) return -1;
    if (!*str) return 0;

    char *p = str;
    for (; *p; p++) {}
    p--;

    for (; p >= str && (*p == '\n' || *p == '\r'); p--) *p = 0;

    p++;

    return (ssize_t)(p - str);
}
注意:您必须提供足够的空间来容纳整行数据。您上面的数据将超过允许的
100
字符数,从而导致部分或短读。您可以在指定的位置检查并处理这些数据(或者简单地为每行提供足够的存储空间,就像我所做的那样,将长度增加到
128


将每行拆分为单词

好的,现在的注释有助于阐明您试图实现的目标。在我们研究实现之前,让我们先看一看C。C是一种精确的语言,它比任何其他语言(汇编除外)都要精确。C中没有足够接近的语法

虽然有很多方法可以解决问题,但对于每一行代码和每一行中的每一个字符来说,要么是对的,要么是错的。你必须理解为什么需要每个字符以及每个字符的作用。对于每个函数,无论是来自标准库的函数,还是你编写的函数,你都必须知道参数函数获取、函数对每个参数执行的操作以及每个函数返回的内容

C为您提供了对组成程序的内存的逐地址访问,您可以根据自己的需要使用和管理该内存。C没有足够的能力和学习曲线。这就是它的能力和学习曲线的来源。您必须以这样的细节和准确度来学习C。这需要时间工作,就像学习任何新的语言一样,但是一旦你掌握了基本知识,天空就是极限

在学习C语言时,当你遇到一些你不懂的东西时,查一下。使用你正在使用的标准库的手册页面的主要权威。使用一个著名的教程。在这里提问。但是要小心,在所谓的编程网站上发布的许多代码完全是错误的

所有编译器都为您提供了帮助您正确使用的工具。最基本和最重要的是编译器在编译代码时发出的警告
$ ./bin/fgets_struct dat/synonym.txt

$ ./bin/fgets_struct dat/synonym.txt

  synonym[  0].ausdruck  : Kernfission;Fission;Kernspaltung;Atomspaltung;
  synonym[  0].anmerkung :

  synonym[  1].ausdruck  : Wiederaufnahme;Fortfuehrung;
  synonym[  1].anmerkung :

  synonym[  2].ausdruck  : wegfahren;wegfliegen;abfliegen;aufbrechen;abfahren;abduesen (ugs.);davonfahren;fortfahren;abreisen;
  synonym[  2].anmerkung : (ugs.)

  synonym[  3].ausdruck  : Training;Kurs;Workshop;Weiterbildung;Seminar;Kursus;Bildungsmassnahme;Lehrgang;
  synonym[  3].anmerkung :

  synonym[  4].ausdruck  : Zerlegung;Demontage;Entlassung;Abbau;
  synonym[  4].anmerkung :
gcc -Wall -Wextra -O3 -o bin/fgets_struct_words fgets_struct_words.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXS 256
#define MAXC 128
#define MAXW 64
#define MAXL 32

typedef struct {
    char ausdruck[MAXW][MAXL];
    char anmerkung[MAXW];
    size_t n;
} synonym;

ssize_t str_rmcrlf (char *str);

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

    char buf[MAXC] = {0};
    synonym synonym[MAXS] = {{{{0}},{0},0}};
    size_t i, j, idx = 0;
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* read each line in file until MAXS synonym elements filled */
    while (idx < MAXS && fgets (buf, MAXC, fp))
    {
        if (*buf == '#') continue;          /* skip beginning with '#'  */

        char sbuf[MAXW] = {0};
        char *p = NULL;
        ssize_t n = 0, len = 0;

        if ((len = str_rmcrlf (buf)) == -1) /* strip crlf, get length   */
            continue;                       /* continue on error        */

        /* copy each word in buf to ausdruck[n] or anmerkung[n] */
        for (p = strtok (buf, " ;"); p; p = strtok (NULL, " ;\n")) {
            if (*p == '(') {    /* copy word in () to anmerkung */
                if (sscanf (p, "(%[^)\n]", sbuf))           /* read "(...)" */
                    strcpy (synonym[idx].anmerkung, sbuf);  /* copy "..."   */
            }
            else /* copy word to array */
                strcpy (synonym[idx].ausdruck[n++], p);

        }
        synonym[idx++].n = n; /* set n, increment idx */
    }

    for (i = 0; i < idx; i++) 
    {
        putchar ('\n');

        for (j = 0; j < synonym[i].n; j++)
            printf ("  synonym[%3zu].ausdruck[%2zu]  : %s\n",
                    i, j, synonym[i].ausdruck[j]);

        if (*(synonym[i].anmerkung))
            printf ("\n  synonym[%3zu].anmerkung : (%s)\n", i, 
                    synonym[i].anmerkung);
        else
            printf ("\n  synonym[%3zu].anmerkung :\n", i);
    }

    return 0;
}

/** stip trailing newlines and carraige returns by overwriting with
 *  null-terminating char. str is modified in place. The new length
 *  is retured on success, -1 otherwise.
 */
ssize_t str_rmcrlf (char *str)
{
    if (!str) return -1;
    if (!*str) return 0;

    char *p = str;
    for (; *p; p++) {}
    p--;

    for (; p >= str && (*p == '\n' || *p == '\r'); p--) *p = 0;

    p++;

    return (ssize_t)(p - str);
}
$ ./bin/fgets_struct_words dat/synonym.txt

  synonym[  0].ausdruck[ 0]  : Kernfission
  synonym[  0].ausdruck[ 1]  : Fission
  synonym[  0].ausdruck[ 2]  : Kernspaltung
  synonym[  0].ausdruck[ 3]  : Atomspaltung

  synonym[  0].anmerkung :

  synonym[  1].ausdruck[ 0]  : Wiederaufnahme
  synonym[  1].ausdruck[ 1]  : Fortfuehrung

  synonym[  1].anmerkung :

  synonym[  2].ausdruck[ 0]  : wegfahren
  synonym[  2].ausdruck[ 1]  : wegfliegen
  synonym[  2].ausdruck[ 2]  : abfliegen
  synonym[  2].ausdruck[ 3]  : aufbrechen
  synonym[  2].ausdruck[ 4]  : abfahren
  synonym[  2].ausdruck[ 5]  : abduesen
  synonym[  2].ausdruck[ 6]  : davonfahren
  synonym[  2].ausdruck[ 7]  : fortfahren
  synonym[  2].ausdruck[ 8]  : abreisen

  synonym[  2].anmerkung : (ugs.)

  synonym[  3].ausdruck[ 0]  : Training
  synonym[  3].ausdruck[ 1]  : Kurs
  synonym[  3].ausdruck[ 2]  : Workshop
  synonym[  3].ausdruck[ 3]  : Weiterbildung
  synonym[  3].ausdruck[ 4]  : Seminar
  synonym[  3].ausdruck[ 5]  : Kursus
  synonym[  3].ausdruck[ 6]  : Bildungsmassnahme
  synonym[  3].ausdruck[ 7]  : Lehrgang

  synonym[  3].anmerkung :

  synonym[  4].ausdruck[ 0]  : Zerlegung
  synonym[  4].ausdruck[ 1]  : Demontage
  synonym[  4].ausdruck[ 2]  : Entlassung
  synonym[  4].ausdruck[ 3]  : Abbau

  synonym[  4].anmerkung :
typedef struct {
    char ausdruck[MAXW][MAXL];
    char anmerkung[MAXW];
    size_t aindex;
    size_t n;
} synonym;
                synonym[idx].aindex = n > 0 ? n - 1 : n;/* set aindex   */
        if (*p == '(') {    /* copy word in () to anmerkung */
            if (sscanf (p, "(%[^)\n]", sbuf)) {         /* read "(...)" */
                strcpy (synonym[idx].anmerkung, sbuf);  /* copy "..."   */
                synonym[idx].aindex = n > 0 ? n - 1 : n;/* set aindex   */
            }
        }
    if (*(synonym[i].anmerkung))
        printf ("\n  synonym[%3zu].anmerkung : (%s) index: %zu\n", i, 
                synonym[i].anmerkung, synonym[i].aindex);
<snip>
  synonym[  2].ausdruck[ 0]  : wegfahren
  synonym[  2].ausdruck[ 1]  : wegfliegen
  synonym[  2].ausdruck[ 2]  : abfliegen
  synonym[  2].ausdruck[ 3]  : aufbrechen
  synonym[  2].ausdruck[ 4]  : abfahren
  synonym[  2].ausdruck[ 5]  : abduesen
  synonym[  2].ausdruck[ 6]  : davonfahren
  synonym[  2].ausdruck[ 7]  : fortfahren
  synonym[  2].ausdruck[ 8]  : abreisen

  synonym[  2].anmerkung : (ugs.) index: 5
<snip>
synonym[idx].aindex = n > 0 ? n - 1 : n;