You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fgetsRewrite.ino 2.4KB

10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Demo of rewriting a line read by fgets
  2. #include <SPI.h>
  3. #include <SdFat.h>
  4. // SD card chip select pin
  5. const uint8_t chipSelect = SS;
  6. // file system
  7. SdFat sd;
  8. // print stream
  9. ArduinoOutStream cout(Serial);
  10. //------------------------------------------------------------------------------
  11. // store error strings in flash memory
  12. #define error(s) sd.errorHalt(F(s))
  13. //------------------------------------------------------------------------------
  14. void demoFgets() {
  15. char line[25];
  16. int c;
  17. uint32_t pos;
  18. // open test file
  19. SdFile rdfile("fgets.txt", O_RDWR);
  20. // check for open error
  21. if (!rdfile.isOpen()) {
  22. error("demoFgets");
  23. }
  24. // list file
  25. cout << F("-----Before Rewrite\r\n");
  26. while ((c = rdfile.read()) >= 0) {
  27. Serial.write(c);
  28. }
  29. rdfile.rewind();
  30. // read lines from the file to get position
  31. while (1) {
  32. pos = rdfile.curPosition();
  33. if (rdfile.fgets(line, sizeof(line)) < 0) {
  34. error("Line not found");
  35. }
  36. // find line that contains "Line C"
  37. if (strstr(line, "Line C")) {
  38. break;
  39. }
  40. }
  41. // rewrite line with 'C'
  42. if (!rdfile.seekSet(pos)) {
  43. error("seekSet");
  44. }
  45. rdfile.println("Line R");
  46. rdfile.rewind();
  47. // list file
  48. cout << F("\r\n-----After Rewrite\r\n");
  49. while ((c = rdfile.read()) >= 0) {
  50. Serial.write(c);
  51. }
  52. // close so rewrite is not lost
  53. rdfile.close();
  54. }
  55. //------------------------------------------------------------------------------
  56. void makeTestFile() {
  57. // create or open test file
  58. SdFile wrfile("fgets.txt", O_WRITE | O_CREAT | O_TRUNC);
  59. // check for open error
  60. if (!wrfile.isOpen()) {
  61. error("MakeTestFile");
  62. }
  63. // write test file
  64. wrfile.print(F(
  65. "Line A\r\n"
  66. "Line B\r\n"
  67. "Line C\r\n"
  68. "Line D\r\n"
  69. "Line E\r\n"
  70. ));
  71. wrfile.close();
  72. }
  73. //------------------------------------------------------------------------------
  74. void setup(void) {
  75. Serial.begin(9600);
  76. while (!Serial) {} // wait for Leonardo
  77. cout << F("Type any character to start\n");
  78. while (Serial.read() <= 0) {}
  79. delay(400); // catch Due reset problem
  80. // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  81. // breadboards. use SPI_FULL_SPEED for better performance.
  82. if (!sd.begin(chipSelect, SPI_HALF_SPEED)) {
  83. sd.initErrorHalt();
  84. }
  85. makeTestFile();
  86. demoFgets();
  87. cout << F("\nDone\n");
  88. }
  89. void loop(void) {}