我做了我的研究并做了几次尝试,但没有人开始工作,我不知道为什么,因为我几乎和初学者一样。
来自文本文件:
您好; 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秒,然后它结束程序。我希望它显示整个文件的内容。我该怎么办?
答案 0 :(得分:2)
接受回答后
以下格式"%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'
”。
答案 1 :(得分:1)
通常,fscanf()
%s
会停止在空格处读取字符串,但在这种情况下,您希望停在;
,因此您需要使用括号表达式(扫描集)来排除;
代替%s
。
此外,我在%
之后添加了49以防止缓冲区溢出,并测试两个变量是否已更新,并传递char *
而不是char (*)[50]
%[^;]
转换规范。
while (2 == fscanf(file,"%49[^;];%d", fileName, &seconds))
答案 2 :(得分:1)
所以我使用了一些Jasen代码和bluepixy,它是:
而不是:
while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)
我现在有:
while(fscanf(file,"%[^;];%d",&fileName,&seconds) != EOF)
它有效。但是,我不知道为什么?
因为它是.txt它已经将第一个作为字符串读取了吗? 为什么我把%[^;] s它不起作用? 我不太了解它..
答案 3 :(得分:0)
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吗?您的输入文件包含顽皮字节? (例如非UTF-8编码或控制字符)?是é
(法语强调e),Ꮂ
(cherokee hv),Ы
(西里尔语yeru),א
(希伯来语aleph),Ω
(希腊大写)欧米茄)算作一封信?分叉周围的空间是否可以接受?也许你想要一些像libunistring这样的UTF-8库?