C/C++ CSV Writer
Introduction
This project was created in order to enable a CSV writing API for C programmers.
The CSV format is commonly easy to parse/write, but there are special cases which are less-trivial, and that makes it recommended to use a standard tested writer
API & Usage Example
Usage Example
#include <stdio.h>
#include "csvwriter.h"
int main() {
char *firstLine[] = {"this", "is the first line", "that ends here"};
char *secLine[] = {"this field, contains a comma", "this field, \" contains a quote", "this field\ncontains a newline"};
char *thirdLine[] = {"this line is crazy", "12345\"\"sdgdsag,adad\"\"\"\nabcdefg", "\","};
char **data[] = {firstLine, secLine, thirdLine};
// If you like to output to STDOUT, use NULL as filename
CsvWriter *csvWriter = CsvWriter_new("Book1.csv", ",", 0);
int i, j;
for (i = 0 ; i < 3 ; i++) {
for (j = 0 ; j < 3 ; j++) {
if (CsvWriter_writeField(csvWriter, data[i][j])) {
printf("Error: %s\n", CsvWriter_getErrorMessage(csvWriter));
return 1;
}
}
CsvWriter_nextRow(csvWriter);
}
CsvWriter_destroy(csvWriter);
return 0;
}
The result in Excel:

API
// Create a new instance of CsvWriter
// Returns an instance of CsvWriter
//
// filePath - path to CSV file - pass NULL to print the output to STDOUT
// delimiter - pointer to a single char to be considered as delimiter. If NULL is passed, using default, which is a comma (,) char
// append - If file is already existing, append to it, instead of overriding
CsvWriter *CsvWriter_new(const char *filePath, const char *delimiter, int append);
// Add a field to the current row
// Returns 0 in case of success. Non-zero in case of failure
//
// csvWriter - an instance of CsvWriter
// field - a c-string that contains the text to be written
int CsvWriter_writeField(CsvWriter *csvWriter, char *field);
// Start a new CSV row (should not be called for the first row)
// Returns 0 in case of success. Non-zero in case of failure
//
// csvWriter - an instance of CsvWriter
int CsvWriter_nextRow(CsvWriter *csvWriter);
// Get the error message, for the last occurred error
// Returns an c-string
//
// csvWriter - an instance of CsvWriter
const char *CsvWriter_getErrorMessage(CsvWriter *csvWriter);
// Destroy and release memory of a CsvWriter instance
//
// csvWriter - an instance of CsvWriter
void CsvWriter_destroy(CsvWriter *csvWriter);