切片文件字符串

时间:2017-05-17 13:06:36

标签: c file slice

我有一个文本文件,其中包含ID和名称全部在一行

314 name1   122 name3   884 name2

ID为3位数(我们将其作为char处理),然后我们有一个空格,后跟8位数字(包括空格),然后是另一个人的ID /名称等......

所以我打开一个文件,阅读它并希望"切片"它

*我要提及的struct并不重要,只是一个例子,可以在底部找到

基本上取前三个数字并将它们放在ID下的结构中,然后忽略以下空格,并抓住后面的8位数字并将它们放在名称下的相同结构中,依此类推(只需删除第一个)每次12个数字的文件),问题只是切片

我来自Python,如果我有一个string,并且只想保留前两位数,我会做string = string[0-2]

之类的事情
//ProductTree is a struct 

char initial_s[sizeof(initialStockFile)];
ProdudctTree* temp = NULL;
fscanf(initialStockFile, "%s", initial_s);
        temp = malloc(sizeof(ProductTree));
        while( initial_s != '\0' ){
            temp->id = initial_s[0-9];
            temp->productName = initial_s[10-20];
            initial_s = initial_s+21;
            temp = temp->right;
        }
        temp->right = NULL;
        return temp;

这是我尝试过的,但显然不起作用

结构如果有人好奇

typedef struct ProductTree {
    char* id;               //Product ID number. This is the key of the search tree.
    char* productName;      //Name of the product.
    struct ProductTree *left, *right;
} ProductTree;

2 个答案:

答案 0 :(得分:1)

由于你来自Python,string.split(s[, sep[, maxsplit]])已经在这里提到了,它在python中做了与str类似的工作(有一些不同之处:没有默认的分隔符。它确实如此)不返回字符串列表。它只返回第一个拼接,然后您需要再次调用它,NULL设置为fgets(tmp_str, 13, filename))。

但是没有必要使用任何在字符串中搜索某个分隔符的函数,因为您知道要将文件切片为每个12个字符长的字符串(然后将每个字符串切成包含该字符串的字符串)前3个字符和一个包含最后8个字符的字符串,丢弃它们之间的一个字符。)

对于第一部分,将文件切片为12个字符长的字符串,您有两个选项:

  • 您可以使用'\0'一次从文件中读取12个字符(大小为13,因为它读取的字符数少于大小,因为它需要多一个字符串以strncpy(tmp_str, &initial_s[i * 12], 12)结束字符串)
  • 或者您可以将所有文件读入字符串。然后在循环中,使用i(假设0是我们的计数器,从initial_s开始,文件被读入i * 12)以复制12个字符,从位置{开始{1}}进入tmp_str(并且不要忘记使用tmp_str[12] = '\0'终止字符串。

对于第二部分,您还有两个选择:

  • 您可以再次使用strncpy()。这一次首先将3个字符复制到temp->id,从tmp_str的乞讨开始。然后将8个字符复制到temp->productName,从位置4开始(记住用'\ 0'终止所有字符串)。如果这样做,您可以将struct更改为具有char数组而不是指向chars的指针:

    typedef struct ProductTree {
        char id[4];               //Product ID number. This is the key of the search tree.
        char productName[9];      //Name of the product.
        struct ProductTree *left, *right;
    } ProductTree;
    
  • 或者你可能对第二部分有点“聪明”。让temp->id指向tmp_str的开头,让temp->productName指向tmp_str中的第5个字符,并将它们之间的空格更改为'\0'以终止temp->id 1}}:

    temp->id = tmp_str;
    tmp_str[3] = '\0';
    temp->productName = tmp_str[4];
    

无论您选择哪个选项,请记住为所有字符串分配内存,检查所有输入是否有错误,并在完成后释放字符串和结构。

答案 1 :(得分:0)

您可能想要使用LibC strtok功能。它允许您在给定分隔符列表的情况下拆分字符串。

以下是与您的项目类似的示例:

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

int     main(int argc, char **argv)
{
  int   i;
  char  *line;
  char  *tok;

  i = 0;
  if (!(line = strdup("123 Hello 345 World 678 Foo 901 Bar")))
    return EXIT_FAILURE;
  tok = strtok(line, " ");
  while (tok)
    {
      if ((i % 2) == 0)
        printf("ID: ");
      else
        printf("Name: ");
      puts(tok);
      tok = strtok(NULL, " ");
      ++i;
    }
  free (line);
  return EXIT_SUCCESS;
}

哪个输出:

ID: 123
Name: Hello
ID: 345
Name: World
ID: 678
Name: Foo
ID: 901
Name: Bar