c - 从csv文件中读取错误的数字 '\n'

标签 c file-io fread

函数读取csv文件,用空字符替换分隔符并计算列和换行符的数量,但返回错误的“\n”数量,我不知道为什么?请帮忙!

在代码末尾注释:应该是 24643 - 实际是 24687

示例数据:我在必要时手动添加了“,”分隔符以显示列更改。

产品,23659,LAUX431GDS X431,图形诊断扫描工具,P,LAUX431GDS,CANDO INTERNATIONAL,右,OE级访问国内、欧洲和亚洲制造商,用于读取/清除代码、实时数据图形和双记录定向测试和模块编码(将提供用于 4 channel 示波器、点火分析仪、传感器模拟器和万用表的单独模块)

  • 所有车辆系统及其模块的诊断访问和通信速度无与伦比。支持 Wifi,允许您访问您喜爱的网站以获取故障排除建议、图表和维修信息。
  • 一键更新,一次更新一个或多个汽车系列
  • 无需连接到电脑进行更新,所有补丁和软件更新都直接通过您进行订阅每年该工具都会更新。
  • 包括第一年的更新

        int getCurrentData(FILE *current){
    
        int totalChars = 0, colCount = 0, productCount = 0;
        char *buffer = NULL, next = '\0';
        size_t i = 0;
    
        fseek(current, 0, SEEK_END);
        size_t fileSize = ftell(current);
        rewind(current);
    
        buffer = malloc(fileSize);
        fread(buffer, fileSize, 1, current);
    
        /*replacing delimiter with null character*/
        for (i = 0; i < fileSize; i++){
            if (buffer[i] == ',' && buffer[i+1] != ' '){
                buffer[i] = '\0';
            }
        }
        /*finds column and product count*/
        for (i = 0; i < fileSize; i++){
            if (buffer[i] == '\0' && productCount == 0 || buffer[i] == '\n' && productCount == 0){
                colCount++;
            }
            if (buffer[i] == '\n' && i < fileSize){
                productCount++;                         /*should be 24643 - actual 24687*/
            }
        }
    
        return productCount;
    }
    
  • 最佳答案

    问题数量

    1. 主要问题是替换分隔符循环可能会将 \n 替换为 \0

    2. 次要:long fileSize 应为 size_t fileSize

    3. if (next != EOF){ 应删除。

    4. 次要:buffer = malloc(fileSize + 1); 应为 buffer = malloc(fileSize);

    5. 替换循环困惑

      size_t fileSize = ftell(current);
      ...
      buffer = malloc(fileSize);           // later add error checking
      fread(buffer, fileSize, 1, current); // later add error checking
      /*replacing delimiter with null character*/
      for (size_t i = 0; i < fileSize; i++){
        if (buffer[i] == ',') {
          // Not sure why OP has (buffer[i+1] != ' ')?  Maybe \n was originally meant
          if ((i+1) >= filesize) || ((buffer[i+1] != ' ') && (buffer[i+1] != '\n'))) {
            buffer[i] = '\0';
          // Or rather than the above if(), maybe something simple:
          buffer[i] = '\0';
          }
        }
      }  
      

    代码未测试 - 抱歉时间不够。

    关于c - 从csv文件中读取错误的数字 '\n',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979784/

    相关文章:

    检查 VirtualAlloc 是否返回了 VirtualAddress

    python - 如何只读取前两个数字? python +串口

    php - 使用 php 访问文本文件?

    file-io - 如何使用 vala 递归复制目录?

    c++ - 以下递归目录搜索和文件打开有什么问题?

    c - fwrite 打印垃圾,fread 读取垃圾结构

    有人可以解释\n、\b、\r 在 C 中的行为吗?

    c - GET 请求 header 字段和值是否区分大小写?

    javascript - 多少毫秒后我可以确定文件是用 Xul 写入的?

    c - 在 C 中将两个文件合并为第三个文件(fread 和 fwrite)