使用fscanf读取C语言

时间:2014-12-28 21:54:16

标签: c scanf

我做了我的研究并做了几次尝试,但没有人开始工作,我不知道为什么,因为我几乎和初学者一样。

来自文本文件:

  

您好; 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秒,然后它结束程序。我希望它显示整个文件的内容。我该怎么办?

4 个答案:

答案 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库?