- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须读入一个包含 5 个字段(int、char[]、char[]、char[]、float)的 csv 文件,看起来像这样:
2345678;Meier;Hans;12.10.1985;2.4;
1234567;Müller;Fritz;17.05.1990;1.9;
我必须将字段放在一个结构中,然后在完成一行后将结构放入结构类型的数组中......
为了学习效果,我们只能使用LOW-LEVEL编码,只能使用fgetc、strcpy等函数,不能使用字符串,只能使用char[]...现在我让我的算法逐个字符地读取文本文件,但我在正确分离它们、再次将它们组合在一起并将它们正确分配给结构字段时遇到了问题。这是我的代码:
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
struct Stud{
long matrnr;
char vorname[30];
char name[30];
char datum[30];
float note;
};
const int MAX = 30;
Stud stud;
Stud mystud[30]; // <<-- Array of "Stud" type
//memset((void*)mystud,0,sizeof(mystud) * sizeof(Stud));
int wordCounter(0);
int i(0); //thats the charCounter or index
int studentCounter(0);
char wort[MAX];
//int matrnr;
//char vorname[MAX];
//char name[MAX];
//char datum[MAX];
//float note;
FILE * pFile;
int cnr(0);
pFile=fopen("studentendaten.txt","r");
if (pFile==nullptr)
{
perror ("Fehler beim öffnen der Datei");
}
else
{
while (cnr != EOF)
{
(cnr=fgetc(pFile)) ;
if ((char)cnr == '\n') {
mystud[studentCounter] = stud;
studentCounter++;
continue;
}
if ((char)cnr == ';') {
wort[i] = '\0';
switch (wordCounter % 5) {
case 0:
stud.matrnr = atol(wort);
break;
case 1:
strcpy(stud.name, wort);
break;
case 2:
strcpy(stud.vorname, wort);
break;
case 3:
strcpy(stud.datum,wort);
break;
case 4:
stud.note = atof(wort);
break;
}
wordCounter++;
i = 0;
continue;
}
if (wordCounter % 5 == 0 && (char)cnr != ';') {
wort[i] = (char)cnr;
i++;
//stud.matrnr = atol(wort);
}
if (wordCounter % 5 == 1) {
wort[i] = (char)cnr;
i++;
//strcpy(stud.name, wort);
}
if (wordCounter % 5 == 2) {
wort[i] = (char)cnr;
i++;
//strcpy(stud.vorname, wort);
}
if (wordCounter % 5 == 3) {
wort[i] = (char)cnr;
i++;
//strcpy(stud.datum,wort);
}
if (wordCounter % 5 == 4) {
wort[i] = (char)cnr;
i++;
//stud.note = atof(wort);
}
}
fclose (pFile);
}
for (int i(0) ; i <= studentCounter; i++) {
cout <<mystud[i].matrnr << " " << mystud[i].name << " " << mystud[i].vorname <<" "
<< mystud[i].datum <<" " << mystud[i].note << endl;
//printf("%5ld %5s %5s %5s %5f \n",mystud[i].matrnr,mystud[i].name,mystud[i].vorname,mystud[i].datum,mystud[i].note);
}
return 0;
}
我不确定它是否与错误的增量变量有关,或者我没有在我的 wort[] 数组的末尾放置 '\0' 的事实..因此无法识别结束我的阵列?如果是这样,我该怎么做而不知道到底在哪里......? (我不知道单词的长度..)
编辑:我再次更新了我的代码,唯一让我感到奇怪的是 LAST LINE IS NOT BEING CORRECTLY PARSED ,它显示了一些垃圾,我看不到我的代码中的错误...
2345678;Meier;Hans;12.10.1985;2.4;
1234567;Müller;Fritz;17.05.1990;1.9;
8392019;Thomas;Kretschmer;28.3.1920;2.5;
3471144;Mensch;Arbeit;29.2.2013;4.5;
2039482;Test;Test;30.20.2031;2.0;
7584932;Bau;Maschine;02.02.2010;2.3;
2345678;Meier;Hans;12.10.1985;2.4;
1234567;Müller;Fritz;17.05.1990;1.9;
8392019;Thomas;Kretschmer;28.3.1920;2.5;
3471144;Mensch;Arbeit;29.2.2013;4.5;
2039482;Test;Test;30.20.2031;2.0;
7584932;Bau;Maschine;02.02.2010;2.3;
2345678;Meier;Hans;12.10.1985;2.4;
1234567;Müller;Fritz;17.05.1990;1.9;
8392019;Thomas;Kretschmer;28.3.1920;2.5;
3471144;Mensch;Arbeit;29.2.2013;4.5;
2039482;Test;Test;30.20.2031;2.0;
7584932;Bau;Maschine;02.02.2010;2.3;
2345678;Meier;Hans;12.10.1985;2.4;
1234567;Müller;Fritz;17.05.1990;1.9;
8392019;Thomas;Kretschmer;28.3.1920;2.5;
3471144;Mensch;Arbeit;29.2.2013;4.5;
2039482;Test;Test;30.20.2031;2.0;
7584932;Bau;Maschine;02.02.2010;2.3;
最佳答案
建议:使用case
结构进行解析,自己做一个“copyToSemicolon”函数:然后你可以这样写
sIndexCount = 0;
char temp[50];
while((cnr=fgetc(pFile)) != EOF) {
offset = 0;
for(var = 0; var < 5; var++ {
switch(var) {
case 0:
offset = copyToSemicolon(temp, cnr, offset) + 1;
stud.matrnr = atoi(temp);
break;
case 1:
offset = copyToSemicolon(mystud[sIndexCount].vorname, cnr, offset) + 1;
break;
... etc
}
}
sIndexCount++;
if(sIndexCount == 50) break; // in case the input file is longer than our structure
}
并且您需要一个函数 copyToSemicolon
,它将两个 char*
指针作为输入,并从第二个字符串(从 offset
开始)复制字符>) 直到它到达分号或行尾 - 并返回它到达的偏移量(最后一个字符读取)。
int copyToSemicolon(char* dest, char* source, int offset) {
while(source[offset] != ';' && source[offset] != '\n') {
*dest = source[offset++];
dest++;
}
return offset;
}
编辑 strtok
方法:
sIndexCount = 0;
char temp[50];
while((cnr=fgetc(pFile)) != EOF) {
offset = 0;
temp = strtok(cnr, ';');
for(var = 0; var < 5; var++ {
switch(var) {
case 0:
stud.matrnr = atoi(temp);
break;
case 1:
strcpy(mystud[sIndexCount].vorname, strtok(NULL, ';'));
break;
... etc
case 4:
mystud[sIndexCount].note = atof(strtok(NULL, '\n'));
}
}
sIndexCount++;
if(sIndexCount == 50) break; // in case the input file is longer than our structure
}
关于C++ : read csv file with fgetc and separate words on semicolon ";",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19776656/
给定这些字符串: 1;2;3 2;1;3 2;3;1 我需要匹配/找到其中的1(为了简单起见,1可以是任何字符串)。 想出了这个模式作为部分解决方案,目前满足我的需要(因为它在 regexp.test
关于 Io home page它提到了它的小尺寸,但它使用了我以前从未见过的度量单位: small vm (~10K semicolons) 这只是字符(~字节)的大小,还是这里发生了更微妙的事情?
我有以下存储过程。这是给我一些错误 DROP procedure IF exists getQueueMessage; DELIMITER $$ CREATE DEFINER=`root`@`loca
我对一个非常简单的例子感到困惑。我有一个标准列表,因此基本上它的字符串表示形式使用分号作为分隔符。我想用另一个替换它: set(L1 "A" "B" "C") message("L1: ${L1}")
在某些情况下,在单个 JavaScript 文件中包含多个自调用函数会引发错误。让第二个函数返回一个值可以避免错误。 我有一个简单的 HTML 文件... ...使用这些脚本: // two.js
我在 VSCode 中使用 jshint。 jshint 在下面函数的末尾 '}' 处给出“缺少分号”警告 void function doSomething(){ console.log('
正在尝试创建“MortgageData”对象的新实例。 教授说要用: ClassName InstanceName = New ClassName(arg1, arg2, arg3, arg4); 我
同时关注 rustbyexample.com教程中,我输入了以下代码: impl fmt::Display for Structure { fn fmt(&self, f: &mut fmt:
我需要一个正则表达式在具有以下结构的 C# 应用程序中使用: 以分号分隔的域名 有效示例: domain1.com;domain2.org;subdomain.domain.net 我怎样才能用一个正
这个问题在这里已经有了答案: "Uncaught TypeError: undefined is not a function" in JavaScript code block (2 个答案) 关
上周我将 Aptana Studio 更新到最新版本(Aptana Studio 3,内部版本:3.4.2.201308081805)。现在到处都显示警告,提示我的 JS 文件中缺少分号。我知道这些在
今天,在搜索了半个小时的错误后,我发现可以将分号放在if语句后面,而不是代码后面,如下所示:。这基本上意味着,无论a是否等于b,都会完成,而if语句没有任何意义。为什么Java不给我一个错误呢?在什么
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我知道当 grouping commands in bash 时圆括号 () 和花括号 {} 之间的目的区别. 但为什么花括号结构在最后一个命令后需要一个分号,而对于圆括号结构,分号是可选的? $ w
这是关于解析 HTML 的内联 CSS 样式属性。我正在使用 JSoup,但据我所知,JSoup 已选择不对此提供帮助……我不确定为什么。这意味着用户必须找出键和值等中合法字符的规则,即什么构成了“正
在我下面的代码中,我得到了这个编译器错误 error C2236: unexpected 'class' 'Pawn'。您是不是忘记了一个“;”? 但是正如您清楚地看到的那样,我没有漏掉一个分号……是
这个问题有点开玩笑,但我也很好奇正确和最干净的方法来做到这一点。 背景:Kurt Vonnegut 说分号是毫无值(value)的标点符号。他们所做的只是表明你上过大学。 无论如何,我知道如果我有一个
这个问题在这里已经有了答案: What are invalid characters in XML (15 个答案) 关闭 6 年前。 我是一个新手,正在尝试将 XML 从外部第三方导入到 SQL
我有这个示例代码,我在其中定义了一个数组,但它没有编译: $ cat a.go package f func t() []int { arr := [] int { 1,
我必须训练一个算法,使用提供的数据集来评估葡萄酒。但是,数据集将所有数据聚集在一列中(用分号分隔),我不确定如何对它们进行拆分。。这是数据当前格式的输出:我尝试了下面的代码和其他一些东西,但它将它们都
我是一名优秀的程序员,十分优秀!