如何通过C在csv文件的行尾写入新字符串

如何通过C在csv文件的行尾写入新字符串,c,csv,C,Csv,我正在写一个C代码,如果条件匹配,需要在行尾添加新信息 FILE *file = fopen(fileName, "r+"); //read every line if line!=NULL while (fgets(line, LINE_SIZE, file)!= NULL){ //split the line by sep split(line, ',', fields); fprintf(file,",

我正在写一个C代码,如果条件匹配,需要在行尾添加新信息

    FILE *file = fopen(fileName, "r+");

    //read every line if line!=NULL
    while (fgets(line, LINE_SIZE, file)!= NULL){
        //split the line by sep
        split(line, ',', fields);       
        fprintf(file,",%d,%d,%d",D,F,G);
   }

这是我试图编写匹配信息的代码。但是,它会将信息写入行的开头。是否可以将“文件”指针移到行的末尾

您可能还需要执行几个步骤

打开临时文件和现有文件

FILE *file = fopen(fileName, "r");
FILE *tmpFile = fopen(tempFileName, "a+" );
从现有文件中获取一行,修剪下一行,在逗号后附加字段,可能创建逗号分隔的额外字段字符串

while (fgets(line, LINE_SIZE, file)!= NULL){
删除新行并添加参数

    if( line[ strlen(line) - 1  ] == '\n' )
        line[ strlen(line) - 1  ] = '\0';

    fprintf(tmpFile,"%s,%s\n",line, your_field); // Write to temporary file
}
删除旧文件取消链接可能很有用

man -a unlink
然后将临时文件重命名为原始文件

man -a rename

也许你需要遵循更多的步骤

打开临时文件和现有文件

FILE *file = fopen(fileName, "r");
FILE *tmpFile = fopen(tempFileName, "a+" );
从现有文件中获取一行,修剪下一行,在逗号后附加字段,可能创建逗号分隔的额外字段字符串

while (fgets(line, LINE_SIZE, file)!= NULL){
删除新行并添加参数

    if( line[ strlen(line) - 1  ] == '\n' )
        line[ strlen(line) - 1  ] = '\0';

    fprintf(tmpFile,"%s,%s\n",line, your_field); // Write to temporary file
}
删除旧文件取消链接可能很有用

man -a unlink
然后将临时文件重命名为原始文件

man -a rename

没有办法做你想做的事。不能在文件的中间插入字节。 但是,如果您有空间或类似的东西,允许在不覆盖数据的情况下将字节写入文件,那么您可以完成一些接近您想要的东西。说你有台词

"1,2,3,            "
"4,5,6,            "
(注意空格)您可以在此处插入文本。我将使用两个文件指针:

  • 从读取文件指针获取行开始时的位置
  • 使用该文件指针读取该行
  • 将字节数添加到位置的第一个空格
  • 在另一个文件上搜索指向此位置的指针
  • 写入新数据并确保有足够的空间
第一个文件指针将处于“读取”模式,第二个指针将处于“写入”模式,而没有一个指针处于“截断”模式,因为这样会使文件出错


或者使用更好的数据库格式

没有办法做你想做的事。不能在文件的中间插入字节。 但是,如果您有空间或类似的东西,允许在不覆盖数据的情况下将字节写入文件,那么您可以完成一些接近您想要的东西。说你有台词

"1,2,3,            "
"4,5,6,            "
(注意空格)您可以在此处插入文本。我将使用两个文件指针:

  • 从读取文件指针获取行开始时的位置
  • 使用该文件指针读取该行
  • 将字节数添加到位置的第一个空格
  • 在另一个文件上搜索指向此位置的指针
  • 写入新数据并确保有足够的空间
第一个文件指针将处于“读取”模式,第二个指针将处于“写入”模式,而没有一个指针处于“截断”模式,因为这样会使文件出错


或者使用更好的数据库格式

即使这样做,也会覆盖下一行的开头。我建议写另一个文件。嗨@interjay,你说得对。但是,我想添加信息的文件会很大,因此如果我只想添加一点信息,那么打开另一个文件并写入它们将花费更长的时间。例如,文件是10G,但我只在其中添加了100KB。您不能在这样的文件中间添加数据,您真的别无选择,只能写入临时文件,然后在完成时将其重命名为原始文件。还有,是否拥有10G大型CSV文件?这本身就是一个巨大的挑战!一个10G的文本文件是开发过程中某个地方发生了严重错误的一个特定标志。您可能应该考虑将CSV文件完全切换到某个数据库。这正是使用(关系)数据库只需添加另一个表的用例…10G csv文件解析:O?在这方面,脚本比c程序更好。即使你这样做了,也会覆盖下一行的开头。我建议写另一个文件。嗨@interjay,你说得对。但是,我想添加信息的文件会很大,因此如果我只想添加一点信息,那么打开另一个文件并写入它们将花费更长的时间。例如,文件是10G,但我只在其中添加了100KB。您不能在这样的文件中间添加数据,您真的别无选择,只能写入临时文件,然后在完成时将其重命名为原始文件。还有,是否拥有10G大型CSV文件?这本身就是一个巨大的挑战!一个10G的文本文件是开发过程中某个地方发生了严重错误的一个特定标志。您可能应该考虑将CSV文件完全切换到某个数据库。这正是使用(关系)数据库只需添加另一个表的用例…10G csv文件解析:O?在这方面,脚本比c程序更好。