arduino / arduino/ArduinoCore-API

In stream.cpp add readln, to simplify reading Windows and Linux text files

Open
#251 1 comment 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
C++
Stars
306
Forks
150
PR merge metrics
No merged PRs in 30d

Description

### API component

stream.cpp

### Description

Text files can be read using readBytesUntil with the LineFeed character but with Windows files the CR character has to be dealt with. readln would terminate on LF and ignore CR so that the user just sees c-strings representing the text on each line.

### Is this a breaking change?

No

### Additional information

I have been using this code as a solution:
`// as readBytes but terminates on LF (10), ignores CR (13)
// terminates if length characters have been read, timeout, or if the terminator character detected
// returns the number of characters placed in the buffer (0 means no valid data found)

int Stream::readln(char *buffer, int length) {
int index = 0;
int c = 0;
while (index < length) {
c = timedRead();
if (c < 0 || c == 10) {
break;
}
if (c != 13){
*buffer++ = (char)c;
index++;
}
}
*buffer = '\0';
if (c < 0){
return -1;
}else{
return index; // return number of characters, not including null terminator
}
}`

As mentioned earlier, text files can be read using readBytesUntil with the LineFeed character but with Windows files the CR character has to be dealt with. The advantages of readln are that:

- it neatly encapsulates the issues
- it works with both LF and CRLF terminated strings
- no additional cleanup work needed by the programmer

A quick Google search shows a number of questions in Stack Overflow, etc. requesting a solution to reading lines from text files.
I am using the function with LittleFS to read configuration key=value pairs from text files, and to read lines from html files for modification, and removal.
For me it is simple, and works reliably.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in stream.cpp by comparing the requested readln behavior with readBytesUntil and the existing Stream API. Implement the LF termination, CR ignoring, timeout handling, null termination, and return values described in the issue, then verify the API declaration and relevant stream tests if present.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
api
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.