我试图创建一个文件来读取包含CSV的文本文件。然而,出于某种原因,一些fscanf不返回值,但有些返回值。
FILE* reader;
char OptionOne[30]="";
char OptionTwo[30]="";
char OptionThree[30]="";
char OptionFour[30]="";
char answer[1]="";
char CorrectAnswer[1];
char Question[51];
reader = fopen("C:\\Users\\Finley\\Desktop\\Programming\\QuizMachine\\QuizMachine\\fscanf_questions.txt", "r");
if (reader == NULL)
{
printf("Unable to Open File: %s\n", FileName);
}
fscanf(reader, "%[^,],", Question);
fscanf(reader, "%[^,],", OptionOne);
fscanf(reader, "%[^,],", OptionTwo);
fscanf(reader, "%[^,],", OptionThree);
fscanf(reader, "%[^,],", OptionFour);
fscanf(reader, "%[^,],", answer);
为什么第一个fscanf返回一个值,而其他所有fscanf都不返回一个值。我什么也看不见,它们看起来都一样,格式相同。文件格式如下:
您使用什么功能打开文件?,fscanf、fclose、fopen、main、3
以下哪项不是变量类型?,int,float,char,string,4
this line: fscanf(reader, "%[^,],", Question); (and those like it)
have a couple of problems.
1) should always check the returned value from a input I/O statement
to assure the conversion was successful
2) the format string is missing the type conversion, in this case 's'
this line: fscanf(reader, "%[^,],", answer); will fail if the line does not end in a ','
"Why does the first fscanf return a value but all the others not return a value."
ans: 1) because the ' ' after the comma is not consumed
2) use a leading ' ' in the format strings to consume white space
this will also consume an trailing '\n' on each line
3) a type specifier is NOT optional in a format string, use 's'
3a) I would have read in the 'answer' as a char using '%c' for a format conversion
and only created a char, not a char array.
4) to avoid buffer overruns,
include the 'size-1' optional part of each format conversion,
just in case some string length is = or greater than the
receiving buffer
"I cannot see anything and they all seem the same with the same formating
File formatting is like this:"
ans: where is the file formatting info?
this line: printf("Unable to Open File: %s\n", FileName);
the variable FileName is not set.
suggest setting char * FileName = C:\\Users\\Finley\\Desktop\\Programming\\QuizMachine\\QuizMachine\\fscanf_questions.txt"
and using 'FileName' in the fopen() statement.
this line: printf("Unable to Open File: %s\n", FileName);
after this line, should insert 'exit(EXIT_FAILURE);
rather than continue in the program, trying to use that NULL file descriptor pointer
this line: char answer[1]="";
will be a problem as the input is being read in as strings,
so even for a single char string, there still needs to be
room for the trailing '\0'
this line: fscanf(reader, "%[^,],", answer);
1) fails if each line of the input file, including the last line,
does not end in ','
回答
的缓冲区太小,所以fscanf
写入太多,导致损坏。
您给它的大小只有一个字符,但是fscanf
将在其中写入两个字符:您想要的字符3和空字符\0
。
将缓冲区大小增加到2可以解决此问题。
>
需要使用足够大小的缓冲区。答案,因为一个字符串至少需要2char
.@Daniel
fscanf()
应该限制输入以防止缓冲区损坏。宽度说明符通常比缓冲区的大小小1。
char Question[51];
fscanf(reader, "%50[^,],", Question);
应该检查fscanf()
的结果。
if (fscanf(reader, "%50[^,],%29[^,],%29[^,],%29[^,],%29[^,],%1s",
Question, OptionOne, OptionTwo, OptionThree, OptionFour, answer) != 6) {
Handle_Bad_input();
}
如果输入没有以下,“
”,则不要对最后一个值使用“%[^,]”
,否则fscanf()
将读取下一行。
建议在每个“[^,]”
前面加一个空格,以跳过前面的空白。
if (fscanf(reader, " %50[^,], %29[^,], %29[^,], %29[^,], %29[^,],%1s",
更好的是:使用fget()
读取该行,然后扫描缓冲区。
char buf[200];
if (fgets(buf, sizeof buf, reader) == NULL) Handle_IOErrorOrEOF();
if (sscanf(buffer, "%50[^,],%29[^,],%29[^,],%29[^,],%29[^,],%1s",
Question, OptionOne, OptionTwo, OptionThree, OptionFour, answer) != 6) {
Handle_Bad_input();
}
问题:我已经启动了五个elasticsearch节点,但只有66,84%的数据在kibana中可用。当我用localhost检查集群运行状况时:9200/u cluster/health?pretty=true我得到了以下信息: 除kibana指数外,我所有的指数都是红色的。 小部分:
问题内容: 我的集群处于黄色状态,因为未分配某些分片。怎么办呢? 我尝试设置所有索引,但是我认为这不起作用,因为我使用的是1.1.1版本。 我也尝试过重新启动所有机器,但同样发生。 任何想法? 编辑: 群集统计信息: 问题答案: 这些未分配的分片实际上是主节点上实际分片的未分配副本。 为了分配这些分片,您需要运行一个新的elasticsearch实例来创建一个辅助节点来承载数据副本。 编辑: 有时
我在低源硬件配置的机器上得到了1个节点、1个碎片、1个副本体系结构。我必须将Elasticsearch堆大小保持在总内存的20%,并且我索引1K~1M文档到Elasticsearch关于硬件配置。我有不同类型机器,从2GB到16GB,但由于它们是32bit体系结构,我只能使用300M到1.5GB的最大内存作为堆大小。 由于某些原因,我不知道为什么,Elasticsearch创建了一些带有未分配碎片
我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是被分配的内存与未分配的内存。我被告知,对于一个基本的、“朴素的”内存分配器,对的调用必须提供与16字节对齐的大小(倍数)。这意味着,如果我需要分配5字节的内存,则应用操作(5+(16-1))&~(16-1)),在本例中,该操作最多舍入为16。如果请求的大小是17而不是5,那么它将舍入为32。 这意味着为了对齐,我们从操作系统返回的字节
我正在windows 8上运行弹性搜索4.1版。我试图通过java索引文档。运行JUNIT测试时,错误显示如下。 我不明白,为什么导致这个错误发生。当删除数据或索引时,它工作正常。可能的原因是什么。
问题内容: 我有一个具有4个节点的ES集群: 我不得不重新启动search03,当它回来时,它又重新加入了群集,没有问题,但是留下了7个未分配的碎片。 现在,我的集群处于黄色状态。解决此问题的最佳方法是什么? 删除(取消)分片? 将分片移动到另一个节点? 将分片分配给节点? 将“ number_of_replicas”更新为2? 还有其他东西吗? 有趣的是,当添加新索引时,该节点开始在该节点上工作