繁体   English   中英

使用fscanf在C中读取

[英]Reading in C using fscanf

我做了研究,做了几次尝试,但都没有成功,我也不知道为什么,因为我和初学者几乎一样。

从文本文件:

您好; 20

等待10

请; 5

我想将第一个单词“ Hello”保存到变量中,将数字20保存到另一个变量中。 其余各行也是如此。

我有这个:

int main()
{

FILE* file;
char fileName[50];
int seconds;

file = fopen("order.txt","r");

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)
{

printf("%s",fileName);
printf("\n");
sleep(seconds);

}

fclose(file);
}

我试图更改fscanf中的内容,但没有任何效果,输出如下:

您好; 20

等待10

请; 5

----------------------

我尝试了一些新的东西(好像我应该编辑它而不是创建答案),它是从这样的文件中获取内容的:

将Order.txt

hello.txt的; 20

wait.txt; 10

please.txt; 5

我想要一个文件名,将其打开,显示X时间的内容,全部显示为3,这导致我:

orderFile = fopen("order.txt","r");

        while(fscanf(orderFile,"%49[^;];%d",fileName,&seconds) == 2)
        {
            contentFile = fopen(fileName,"r");

            while(fscanf(contentFile,"%[^\t]",textContent) == 1)
            {
                printf("%s\n", textContent);
            }

            sleep(seconds);

            fclose(contentFile);
        }

        fclose(orderFile);

但是,它仅显示第一个文件内容,等待20秒钟,然后结束程序。 我希望它显示整个文件的内容。 我该怎么做?

接受答案后

以下格式"%49[^;];%d"将前一行的'\\n'读取为文件名的一部分。 最好先使用领先的空白

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)       // OP original
while (2 == fscanf(file,"%49[^;];%d", fileName, &seconds))  // problem
while (2 == fscanf(file," %49[^;];%d", fileName, &seconds)) // better-space added

甚至更好:因为数据是每行的 ,所以读取该 ,然后解析该字符串 由@ jamesdlin建议

#define INT_STRING_SIZE_MAX  22
char buf[(sizeof fileName + INT_STRING_SIZE_MAX) * 2];  // I like 2x buffers

while(fgets(buf, sizeof buf, file) != NULL) {
  if (2 != sscanf(buf,"%49[^;];%d", fileName, &seconds)) {
    break;  // Maybe add format error message.
  }
  ...
}

sscanf(buf,"%49[^;];%d"... ,一个" "不需要为代码读取线由行和没有“上一行的'\\n' ”存在。

通常,具有%s fscanf()停止在空白处读取字符串,但是在这种情况下,您要在;停止; 因此,您需要使用方括号表达式(扫描集)来排除; 代替%s

另外,我在%之后添加了49,以防止缓冲区溢出,并测试两个变量是否已更新,并将char *而不是char (*)[50]传递给%[^;]转换规范。

 while (2 == fscanf(file,"%49[^;];%d", fileName, &seconds))

因此,我使用了一些Jasen代码和bluepixy,它们是:

而不是:

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)

我现在有:

while(fscanf(file,"%[^;];%d",&fileName,&seconds) != EOF)

而且有效。 但是,我不知道为什么?

因为它是.txt,它已经将第一个作为字符串读取了? 为什么我放%[^;]无效? 我不太了解。

fscanf返回成功扫描的项目数(请参见fscanf(3)手册页)。 您应该使用:

while(fscanf(file,"%s;%d",&fileName,&seconds) == 2) 

屁股甚至很危险。 最好提供您的fileName的最大宽度,在[A-Za-z0-9_] (或任何适合您的设置)仅接受49个字符(并在结尾的0字节处留一个空格),因此

  while(fscanf(file,"%49[A-Za-z0-9_];%d",&fileName,&seconds) == 2) 

实际上,我会循环使用getline(3) (或其他fgets )读取每一行,并分别解析(使用某些sscanf ,或者手动解析)。

您需要定义更多什么是可接受的输入。 分号前可以出现哪些字符? 您确定要接受所有这些吗? 您正在使用UTF-8吗? CAn您的输入文件包含顽皮的字节吗? (例如非UTF-8编码或控制字符)? é (法语重音e), (切诺基HV), Ы (西里尔语yeru), א (希伯来字母aeph), Ω (希腊大写欧米茄)是否算作字母? 分号周围是否可以接受空格? 也许您想要一些像libunistring这样的UTF-8库?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM