如何从C中具有非英语(土耳其语)内容的文件中读取十进制数字

问题描述 投票:0回答:3

我有一个文件,如果价格为整数,我试图将输入的单位数量乘以价格,可以,但是没有十进制值0.0000。谢谢。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

int main()
{
    int birim;    // unit
    float birim_fiyat; // unit price
    char barkod[10]; // barcode
    char kategori[10], urunadi[10], istenen[10];
    float ucret=0.00;  //price
    setlocale(LC_ALL,"Turkish");
    FILE *fp=fopen("barkod.txt","r+");
    if(fp==NULL)
    {
        puts("cannot open file");
        exit(1);
    }
    printf("Enter the Product Barcode Number to be Called:");
    scanf("%s",&istenen);  // find barcode

    printf("How many:");
    scanf("%d",&birim);

    while(!feof(fp))
    {
        fscanf(fp,"%s %s %s %f\n",barkod,urunadi,kategori,&birim_fiyat);
        if(strcmp(istenen,barkod)==0)
        {
          printf("Aranan Ürün Bulundu: %s %s\n", urunadi,kategori);
          ucret +=birim*birim_fiyat;
    }
}

这是我的条形码文件:

    825 Meyve sebze 12.50
    403 Cikolata Tatli 5.50
    902 Havu‡ Meyve 15.50
    881 S A 15.50
    866 Zemzem suyu 10.50
    300 Tiner Icecek 10.50

c file
3个回答
2
投票

我对locale一无所知,但这似乎是导致您遇到此问题的原因。我接受了您的代码,并删除了所有土耳其语字母,然后尝试运行。一切正常!以下是我对您的代码进行的快速而肮脏的修改。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int birim;    // unit
    float birim_fiyat; // unit price
    char barkod[10]; // barcode
    char kategori[10], urunadi[10], istenen[10];
    float ucret=0.00;  //price
    FILE *fp=fopen("barkod.txt","r+");
    if(fp==NULL)
      {
        puts("cannot open file");
        exit(1);
      }
      printf("Enter the Product Barcode Number to be Called:");
      scanf("%s",&istenen);  // find barcode

  printf("How many:");
  scanf("%d",&birim);

  while(!feof(fp))
  {
  fscanf(fp,"%s %s %s %f\n",barkod,urunadi,kategori,&birim_fiyat);
  printf("%s %s %s %f\n",barkod,urunadi,kategori,birim_fiyat);
  if(strcmp(istenen,barkod)==0)
  {
  printf("Aranan: %s %s\n", urunadi,kategori);
  ucret +=birim*birim_fiyat;

 }
  }

  printf("%f\n", ucret);

}

barkod.txt

825 Me e 12.5
403 Ci e 5.50
902 Hav e 15.50
881 S e 15.50
866 Zemz e 10.50
300 Tinev Icecek 10.50

输出

Enter the Product Barcode Number to be Called:825
How many:2
825 Me e 12.500000
Aranan: Me e
403 Ci e 5.500000
902 Hav e 15.500000
881 S e 15.500000
866 Zemz e 10.500000
300 Tinev Icecek 10.500000
25.000000

它打印的是25,我希望这是您期望的结果。在进一步调查中,我尝试打印一个土耳其字母的十进制值。

代码

#include <stdio.h>

int main() {
    printf("%d\n",'‡');
    return 0;
}

编译器警告

base.c: In function ‘main’:
base.c:4:16: warning: multi-character character constant [-Wmultichar]
    4 |  printf("%d\n",'‡');
      |                ^~~~~

输出

14844065

[正如其他人所提到的,您可能没有在fscanf()进行适当的检查,我并不是在谈论它,请仔细阅读fscanf()手册页。并且,其他人需要回答有关文件中如何包含土耳其字母以及如何成功读取它们的问题。

编辑

为了答案的完整性。从fscanf()的手册页>

成功完成后,这些功能应返回编号成功匹配和分配的输入项的数量;这个数字可以是如果早期匹配失败,则为零。如果输入结束在第一次转换(如果有)完成之前,并且没有如果发生匹配失败,则应返回EOF。如果有错误在第一次转换(如果有)完成之前发生,并且没有发生匹配失败的情况,应返回EOF并errno应设置为指示错误。如果发生读取错误,应设置流的错误指示符。

您不知道文件是否完整(所有4个变量确实存在),文件何时结束或底层读取操作中何时发生错误。因此,必须在fscanf()之后进行成功检查。手册页说如果没有错误发生,它将返回读取的变量数。因此,您可以进行这样的检查。

while(fscanf(fp,"%s %s %s %f\n",barkod,urunadi,kategori,&birim_fiyat) == 4) {
    ....... 
}

如@dxiv所建议,土耳其语十进制分隔符为,而不是.。基于此,您的barkod.txt应该是这样的

barkod.txt

825 Meyve sebze 12,50
403 Cikolata Tatli 5,50
902 Havu‡ Meyve 15,50
881 S A 15,50
866 Zemzem suyu 10,50
300 Tiner Icecek 10,50

然后,使用之前提供的输入(25,000000)运行程序时,程序会很好地输出25.000000(英语等效为825, 2


1
投票

您有很多问题:


1
投票
这里的主要问题是土耳其语区域设置使用逗号作为小数点分隔符。这甚至适用于使用fscanf解析文件内容-它期望在数字中找到一个小数点,,但仅看到.并停止在该位置,然后解析不同步。
© www.soinside.com 2019 - 2024. All rights reserved.