首页 > 解决方案 > 使用 C 写入 csv 文件会导致问题

问题描述

我正在使用 C 程序写入 CSV 文件,但发生了一些奇怪的事情。

这是代码

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

void WriteEmployeeData(employee empF){
    FILE *f;;
    f=fopen("employee.csv","a");
        // printf("%ld\n",ftell(f));
        printf("%d\n",fseek(f, 0, SEEK_END));
        // printf("%ld\n",ftell(f));
        fprintf(f,"%d,%s,%ld,%s,%d\n",empF.employee_id,empF.employee_name,empF.phno,empF.shift,empF.area_code);

    fclose(f);


}

int main(int argc, char const *argv[])
{   employee e[100];
    int len=0;
    ReadEmployeeData(e,&len);
    WriteEmployeeData(e[2]);
    // WriteEmployeeData(e[3]);


    /* code */
    return 0;
}

这是第一种情况的条件的输出(当光标设置到文件的最后一行时)

Employee_ID,Employee_Name,Phone_number,Shift,Area_Code^M
10111,John Smith,9933432921,9:00-13:00,201301^M
10112,Robert ,3914323431,10:00-13:00,201304^M
10113,Will,8884923312,16:00-20:00,110006^M
10114,Rakesh,9090991023,12:00-16:00,110076^M
10115,Kumaar,8292231231,8:00-12:00,201103^M
10116,Arbind,7318341312,11:00-13:00,120331^M
10117,Saurabh,8887567456,12:00-17:30,110087^M
10118,Ram Kumar,1230232331,10:30-18:00,110011^M
10119,Shiv,3213233123,11:30-15:30,201893^M
10120,Lakshay,4355634545,13:00-19:00,121232^M
10121,Rohan,9990999701,11:45-15:00,8773911^M
10113,Will,8884923312,16:00-20:00,110006^M
10114,Rakesh,9090991023,12:00-16:00,110076^M
^M
10113,Will,8884923312,16:00-20:00,110006

当我在 vim 中打开这个 csv 时,如何防止添加额外的行,这就是我得到的。

标签: cdatabasefilecsvstruct

解决方案


问题是您尝试写入的 CSV 文件在每行的末尾都有\r\n(分别代表回车CtrlM和换行或换行)。CtrlJ它可能是来自 MS 操作系统的文件。当您打开文件时,您会看到vim:文本编辑器显示^M某些行仅以\n(您添加的最后一行)和其他行以\r\n. 为什么是字母M?因为\r(回车)与CtrlM.

您尝试使用另一种逻辑写入此文件,仅\n作为 ine 分隔符。如果您首先将“回车 + 换行”CSV 文件转换为仅“换行”的 CSV 文件,并使用dos2unix.

如果您需要保持 CSV 文件原样,请提醒完成您编写的每一行,\r\n而不是\n,如果您想覆盖文件末尾的空白行,请返回 2 个位置以覆盖\n\r


推荐阅读