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