[英]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.