【问题标题】:how to split a text file in c? [duplicate]如何在c中拆分文本文件? [复制]
【发布时间】:2018-04-20 09:38:28
【问题描述】:

我正在那里进行 Socket 编程,我需要读取一个文本文件,然后我需要使用制表符空间拆分该文本文件,然后我需要将每一列分配给一个定义的数组。

但在我的代码中所有字段都是正确的,除了价格列我的价格数组总是返回 0

如何解决?

数组声明代码

int id[10];
char name[10][50];
int qrty[10];
double price[10];

以下代码是拆分文本文件并将值分配给创建的数组

while (fgets(line, sizeof(line), fp)){ 
    sscanf(line,"%d\t%[^\t]\t%d\t%f",&pno,&pname,&qty,&uprice);
    Writen(sockfd,line,strlen(line));
    id[x]=pno;
    strncpy(name[x], pname, 50);
    qrty[x]=qty;
    price[x]=uprice;
    x++;
}

我的文本文件如下

001 Coffee maker    10  3000.00

002 Pressure cooker 4   7000.00

003 Blender 10  2500.00

004 Pillow  10  300.00

005 Camera  5   25000.00

006 Washer  5   25000.00

007 Headphone   3   5000.00

008 Mattresses  5   6000.00

009 Heater  3   1000.00

010 Cookware    2   10000.00

【问题讨论】:

  • 格式字符串中括号 ([) 前缺少%
  • 您确定拨打sscanf 有效吗?你不检查它的返回值。
  • 什么是pnopnameqtyuprice?请提供minimal reproducible example
  • 虽然我把 % 它不工作而 sscanf 工作
  • 顺便说一句,%[^\t]%s 完全一样,在“讨厌的”输入数据上保证缓冲区溢出——总是使用字段宽度转换为字符串。根据您的line 的最大大小,这可能不是问题.. 无论如何都要这样做:) 有什么理由不只使用"%d %49s %d %f"?允许任何空格作为分隔符会更加灵活。

标签: c text file-io


【解决方案1】:

当且仅当a.txt 文件中的字段由制表符(而不是空格)分隔时,这对我有效:

#include <stdio.h>

int main()
{
  char line[1000];
  FILE *fp = fopen("a.txt", "r");

  int pno, qty; 
  double uprice;
  char pname[100];

  while (fgets(line, sizeof(line), fp)) {
    sscanf(line, "%d\t%[^\t]\t%d\t%lf", &pno, &pname, &qty, &uprice);
    printf("%d %s %d %lf\n", pno, pname, qty, uprice);
  }
}

您甚至可以使用fscanf 删除line 缓冲区:

 do
 {
    if (fscanf(fp, "%d %s %d %lf", &pno, &pname, &qty, &uprice) == 4)
      printf("%d %s %d %lf\n", pno, pname, qty, uprice);
 } while (!feof(fp));

免责声明:为简洁起见,此处未进行任何错误检查。

【讨论】:

  • 它比你更有效@Michael Walz
  • %lf 仅在 scanf 中需要。在printf 中,它可以只是%f
  • @ArturPasymowski 没错,但 %lf 在这里更适合对称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多