c - 使用 C 写入 csv 文件会导致问题
问题描述
我正在使用 C 程序写入 CSV 文件,但发生了一些奇怪的事情。
- 如果我最后将光标留在新行(当我用文本编辑器打开它时),它会留下一行然后写入。为此,我尝试使用 rewind 然后 SEEK_END(偏移量为 0,然后 -1)回到开始,但它似乎不起作用。
- 如果光标设置为最后一行的最后一行,它就可以正常工作。
这是代码
#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 时,如何防止添加额外的行,这就是我得到的。
解决方案
问题是您尝试写入的 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
。
推荐阅读
- c++ - 将数组的内容打印到 .txt 文件中
- reactjs - 创建反应文件夹的npx安装错误
- laravel - 如何在 Laravel Eloquent 中防止重复?
- angular - 如何在 Angular 2+ 中使用 Vimeo API
- javascript - 量角器扫描源代码从数组中寻找任何元素 - 就像 Ruby 循环一样
- wso2 - 如何在不同的服务器上运行 wso2 分析和 wso2 api 管理器以向分析服务器显示 api 管理器的静态
- c# - 嵌套对象的 ASP.NET CORE Hot Chocolate 查询错误
- flutter - 我可以继续使用旧版本的颤振包吗
- c# - 如何实现访问者模式来收集物品的总重量和总金额?
- php - 1062 键 'users_email_unique' 的重复条目 'emma@ohp-abudhabi.com'