当前位置: 首页 > 知识库问答 >
问题:

fscanf csv in C.未分配的值

尉迟远
2023-03-14

我试图创建一个文件来读取包含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

共有3个答案

公冶高义
2023-03-14
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 ','
安承教
2023-03-14

回答的缓冲区太小,所以fscanf写入太多,导致损坏。

您给它的大小只有一个字符,但是fscanf将在其中写入两个字符:您想要的字符3和空字符\0

将缓冲区大小增加到2可以解决此问题。

公羊安怡
2023-03-14

>

  • 需要使用足够大小的缓冲区。答案,因为一个字符串至少需要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? 还有其他东西吗? 有趣的是,当添加新索引时,该节点开始在该节点上工作