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;
}
$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;
}
}
c comparative-review file portability
$endgroup$
add a comment |
$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;
}
}
c comparative-review file portability
$endgroup$
$begingroup$
Have you tested your code, and if so, how?
$endgroup$
– 200_success
3 hours ago
add a comment |
$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;
}
}
c comparative-review file portability
$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
c comparative-review file portability
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
add a comment |
$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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
$begingroup$
Have you tested your code, and if so, how?
$endgroup$
– 200_success
3 hours ago