如何使用自定义fgets从csv文件中获取一行

时间:2017-09-25 05:52:11

标签: c csv

我目前正在用C语言编写一个从CSV文件读入的程序,我有一个已定义的缓冲区大小但是在将每一行与缓冲区分开时遇到问题。我可以通过检查'\ n'字符来查看该行的结束位置。但是我无法从缓冲区中提取该行进行解析。有人有想法吗?

#ifndef BUFFSIZE
   #define BUFFSIZE 4096
#endif

int main() {
  int fd;
  int fdBin;
  char * buf = malloc(BUFFSIZE);
  int count = 0;

  bool EOFFlag = false;

  fd = open("SongCSV.csv", O_RDONLY);
  fdBin = open("BinarySongData.bin", O_CREAT | O_WRONLY, "0600");
  if (fd == -1) {
    printf("failed to open a file\n");
    exit(1);
  }

  off_t offset = 0;
  off_t offsetOld = 0;

  int readBytes;

  while (!EOFFlag) {
    offsetOld = offset;
    offset = lseek(fd, offset - offsetOld, SEEK_CUR);

    readBytes = read(fd, buf, BUFFSIZE);

    printf("\n\n%lld\n\n", (offset));
    int i = 0;
    int commaCounter = 0;
    while (i < readBytes) {
      if (buf[i] != '\n') {

      }

      if (buf[i] == '\n') {
        printf("\t\t THIS IS END OF LINE \t%d", i);
        commaCounter = 0;

      }

      if (buf[i] == ',') {
        commaCounter++;
        if (commaCounter == 4) {
          printf("****Album Name****");
        }
      }
      write(fdBin, buf, BUFFSIZE);
      printf("%c", buf[i]);
      i++;
    }
    if (readBytes < BUFFSIZE) {
      EOFFlag = true;
      printf("\nREACHED END OF FILE");
    }
    printf("\n");
    printf("AA: END OF LINE ****%d*****", count);

    count++;
  }

  close(fd);
  close(fdBin);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

我这样做,既简单又简单。我只是快速做到了,任何疑惑只会问我,干杯。

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  int len = sending();
  char *firstline;
  int i = 0;
  char buf[0];
  int rd ;
  int fd = open("hey.csv", O_RDONLY);

  rd = read(fd, buf, 1);    
  firstline = malloc(sizeof(char) * len);
  while (i != len)
    {
      firstline[i] = buf[0];
      i++;
      rd = read(fd, buf, 1);
    }
  firstline[i] = '\0';
  printf("%s\n", firstline);
  return (0);
}

int sending()
{
  int fd = open("hey.csv", O_RDONLY);
  char buf[1];
  int r = 0;
  r = read(fd, buf, 1);
  int len = 0;

  while (buf[0] != '\n')//getting exact size to malloc
    {
      len++;
      r = read(fd, buf, 1);    

    }
  return len;
}