Two cross-platform implementations of getline in C The 2019 Stack Overflow Developer Survey...

Monty Hall variation

Are there any other methods to apply to solving simultaneous equations?

Limit the amount of RAM Mathematica may access?

Geography at the pixel level

What is the use of option -o in the useradd command?

Falsification in Math vs Science

A poker game description that does not feel gimmicky

Spanish for "widget"

"Riffle" two strings

Is it possible for the two major parties in the UK to form a coalition with each other instead of a much smaller party?

Pristine Bit Checking

Does it makes sense to buy a new cycle to learn riding?

Dual Citizen. Exited the US on Italian passport recently

Is flight data recorder erased after every flight?

How long do I have to send payment?

On the insanity of kings as an argument against monarchy

Realistic Alternatives to Dust: What Else Could Feed a Plankton Bloom?

Inflated grade on resume at previous job, might former employer tell new employer?

Time travel alters history but people keep saying nothing's changed

Should I write numbers in words or as numerals when there are multiple next to each other?

Is three citations per paragraph excessive for undergraduate research paper?

How was Skylab's orbit inclination chosen?

What do the Banks children have against barley water?

Output the Arecibo Message



Two cross-platform implementations of getline in C



The 2019 Stack Overflow Developer Survey Results Are InC getline functionJavaScript parallax cross-platform efficiencyTwo implementations of website internationalizationTwo implementations of file-readingLongest string in a vector — two implementationsCross-platform performance and statistical information scriptANSI colors cross platformCross-platform file hash sum generator in PythonPlatform-agnostic windowing libraryA portable cross platform C++17 method to retrieve the current date and time





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







2












$begingroup$


I created my cross-platform implementations of getline function in C.



It takes different arguments and have different return values than 'original' getline function, but aim is the same. The only argument input_file is file from which the line have to be read. Return value is the line read from file or NULL if nothing read.



Here is one implementation, using fgets():



static inline char*
read_next_line(FILE* input_file){
const unsigned int chunk_size=256;
char* line=malloc(chunk_size*sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
unsigned int i;
for(i=0;;++i){
memset(line+chunk_size*i,0,chunk_size);
if(fgets(line+chunk_size*i,chunk_size+1,input_file)==NULL)
break;
if(line[strlen(line)-1]=='n')
break;
char* tmp=realloc(line,chunk_size*(i+2)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(i+2)*sizeof*line+1);
exit(1);
}else
line=tmp;
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)-1]=0;
return line;
}
}


Here is my second implementation, using fgetc():



static inline char*
getline(FILE* input_file){
const unsigned int chunk_size=3;
char* line=calloc(chunk_size,sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
char c;
unsigned int i,j;
for(i=0,j=1;;++i){
c=(char)fgetc(input_file);
if(c==EOF||c=='n')
break;
line[i]=c;
if(i==chunk_size*j){
++j;
char* tmp=realloc(line,chunk_size*(j+1)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(j+1)*sizeof*line+1);
exit(1);
}else{
line=tmp;
memset(line+chunk_size*j,0,chunk_size);
}
}
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)]=0;
return line;
}
}









share|improve this question











$endgroup$












  • $begingroup$
    Have you tested your code, and if so, how?
    $endgroup$
    – 200_success
    3 hours ago


















2












$begingroup$


I created my cross-platform implementations of getline function in C.



It takes different arguments and have different return values than 'original' getline function, but aim is the same. The only argument input_file is file from which the line have to be read. Return value is the line read from file or NULL if nothing read.



Here is one implementation, using fgets():



static inline char*
read_next_line(FILE* input_file){
const unsigned int chunk_size=256;
char* line=malloc(chunk_size*sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
unsigned int i;
for(i=0;;++i){
memset(line+chunk_size*i,0,chunk_size);
if(fgets(line+chunk_size*i,chunk_size+1,input_file)==NULL)
break;
if(line[strlen(line)-1]=='n')
break;
char* tmp=realloc(line,chunk_size*(i+2)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(i+2)*sizeof*line+1);
exit(1);
}else
line=tmp;
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)-1]=0;
return line;
}
}


Here is my second implementation, using fgetc():



static inline char*
getline(FILE* input_file){
const unsigned int chunk_size=3;
char* line=calloc(chunk_size,sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
char c;
unsigned int i,j;
for(i=0,j=1;;++i){
c=(char)fgetc(input_file);
if(c==EOF||c=='n')
break;
line[i]=c;
if(i==chunk_size*j){
++j;
char* tmp=realloc(line,chunk_size*(j+1)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(j+1)*sizeof*line+1);
exit(1);
}else{
line=tmp;
memset(line+chunk_size*j,0,chunk_size);
}
}
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)]=0;
return line;
}
}









share|improve this question











$endgroup$












  • $begingroup$
    Have you tested your code, and if so, how?
    $endgroup$
    – 200_success
    3 hours ago














2












2








2





$begingroup$


I created my cross-platform implementations of getline function in C.



It takes different arguments and have different return values than 'original' getline function, but aim is the same. The only argument input_file is file from which the line have to be read. Return value is the line read from file or NULL if nothing read.



Here is one implementation, using fgets():



static inline char*
read_next_line(FILE* input_file){
const unsigned int chunk_size=256;
char* line=malloc(chunk_size*sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
unsigned int i;
for(i=0;;++i){
memset(line+chunk_size*i,0,chunk_size);
if(fgets(line+chunk_size*i,chunk_size+1,input_file)==NULL)
break;
if(line[strlen(line)-1]=='n')
break;
char* tmp=realloc(line,chunk_size*(i+2)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(i+2)*sizeof*line+1);
exit(1);
}else
line=tmp;
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)-1]=0;
return line;
}
}


Here is my second implementation, using fgetc():



static inline char*
getline(FILE* input_file){
const unsigned int chunk_size=3;
char* line=calloc(chunk_size,sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
char c;
unsigned int i,j;
for(i=0,j=1;;++i){
c=(char)fgetc(input_file);
if(c==EOF||c=='n')
break;
line[i]=c;
if(i==chunk_size*j){
++j;
char* tmp=realloc(line,chunk_size*(j+1)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(j+1)*sizeof*line+1);
exit(1);
}else{
line=tmp;
memset(line+chunk_size*j,0,chunk_size);
}
}
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)]=0;
return line;
}
}









share|improve this question











$endgroup$




I created my cross-platform implementations of getline function in C.



It takes different arguments and have different return values than 'original' getline function, but aim is the same. The only argument input_file is file from which the line have to be read. Return value is the line read from file or NULL if nothing read.



Here is one implementation, using fgets():



static inline char*
read_next_line(FILE* input_file){
const unsigned int chunk_size=256;
char* line=malloc(chunk_size*sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
unsigned int i;
for(i=0;;++i){
memset(line+chunk_size*i,0,chunk_size);
if(fgets(line+chunk_size*i,chunk_size+1,input_file)==NULL)
break;
if(line[strlen(line)-1]=='n')
break;
char* tmp=realloc(line,chunk_size*(i+2)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(i+2)*sizeof*line+1);
exit(1);
}else
line=tmp;
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)-1]=0;
return line;
}
}


Here is my second implementation, using fgetc():



static inline char*
getline(FILE* input_file){
const unsigned int chunk_size=3;
char* line=calloc(chunk_size,sizeof*line+1);
if(line==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*sizeof*line+1);
exit(1);
}
char c;
unsigned int i,j;
for(i=0,j=1;;++i){
c=(char)fgetc(input_file);
if(c==EOF||c=='n')
break;
line[i]=c;
if(i==chunk_size*j){
++j;
char* tmp=realloc(line,chunk_size*(j+1)*sizeof*line+1);
if(tmp==NULL){
fprintf(stderr,"Fatal: failed to allocate %zu bytes.n",chunk_size*(j+1)*sizeof*line+1);
exit(1);
}else{
line=tmp;
memset(line+chunk_size*j,0,chunk_size);
}
}
}
if(strlen(line)==0){
free(line);
return NULL;
}else{
line[strlen(line)]=0;
return line;
}
}






c comparative-review file portability






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 3 hours ago









200_success

131k17157422




131k17157422










asked 5 hours ago









DeBos99DeBos99

917




917












  • $begingroup$
    Have you tested your code, and if so, how?
    $endgroup$
    – 200_success
    3 hours ago


















  • $begingroup$
    Have you tested your code, and if so, how?
    $endgroup$
    – 200_success
    3 hours ago
















$begingroup$
Have you tested your code, and if so, how?
$endgroup$
– 200_success
3 hours ago




$begingroup$
Have you tested your code, and if so, how?
$endgroup$
– 200_success
3 hours ago










0






active

oldest

votes












Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");

StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217157%2ftwo-cross-platform-implementations-of-getline-in-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217157%2ftwo-cross-platform-implementations-of-getline-in-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

is 'sed' thread safeWhat should someone know about using Python scripts in the shell?Nexenta bash script uses...

How do i solve the “ No module named 'mlxtend' ” issue on Jupyter?

Pilgersdorf Inhaltsverzeichnis Geografie | Geschichte | Bevölkerungsentwicklung | Politik | Kultur...