c++.command-line - Inputting comma-delimited data
- rvw (8/8) Jan 29 2006 I am writing a command-line C program to perform cubic-pline interpolati...
- Jan Knepper (7/20) Jan 29 2006 fscanf?
- Bertel Brander (59/66) Jan 29 2006 You could use:
- Bertel Brander (32/34) Jan 29 2006 Just for your reference, this is the C++ version of the same program:
- rvw (7/73) Jan 30 2006 Bertel,
I am writing a command-line C program to perform cubic-pline interpolation on large data files. Each line of the ASCII files will have: x-value,y-value. The values will be converted to long doubles via _atold and then put into separate x-arrays and y-arrays. I can probably eventually write code to properly input the data, but I am hoping someone already has a solid routine for doing it. Thanks in advance for your help. rvw
Jan 29 2006
rvw wrote:I am writing a command-line C program to perform cubic-pline interpolation on large data files. Each line of the ASCII files will have: x-value,y-value. The values will be converted to long doubles via _atold and then put into separate x-arrays and y-arrays. I can probably eventually write code to properly input the data, but I am hoping someone already has a solid routine for doing it. Thanks in advance for your help. rvwfscanf? -- ManiaC++ Jan Knepper But as for me and my household, we shall use Mozilla... www.mozilla.org
Jan 29 2006
rvw wrote:I am writing a command-line C program to perform cubic-pline interpolation on large data files. Each line of the ASCII files will have: x-value,y-value. The values will be converted to long doubles via _atold and then put into separate x-arrays and y-arrays. I can probably eventually write code to properly input the data, but I am hoping someone already has a solid routine for doing it.You could use: #include <stdio.h> #include <stdlib.h> #include <string.h> double *X, *Y; int main() { FILE *f = fopen("test.dat", "rt"); char Line[256]; unsigned int AllocSize = 0, Size = 0, n; if(!f) { fprintf(stderr, "Failed to open test.dat"); return EXIT_FAILURE; } while(fgets(Line, sizeof(Line), f)) { char *s = strtok(Line, ", "); if(s) { double x = strtod(s, 0); if((s = strtok(0, ",")) != 0) { double y = strtod(s, 0); if(Size >= AllocSize) { AllocSize += 128; X = realloc(X, AllocSize*sizeof(double)); Y = realloc(Y, AllocSize*sizeof(double)); } X[Size] = x; Y[Size] = y; Size++; } else { fprintf(stderr, "Wrong line in input"); } } else { fprintf(stderr, "Wrong line in input"); } } for(n = 0; n < Size; n++) { printf("%3u: %f %f\n", n, X[n], Y[n]); } free(X); free(Y); return EXIT_SUCCESS; } I C++ is an option it would be a lot easyer to do it with ifstream and a vector -- Absolutely not the best homepage on the net: http://home20.inet.tele.dk/midgaard But it's mine - Bertel
Jan 29 2006
Bertel Brander wrote:I C++ is an option it would be a lot easyer to do it with ifstream and a vectorJust for your reference, this is the C++ version of the same program: #include <vector> #include <iostream> #include <iomanip> #include <fstream> std::vector<double> X; std::vector<double> Y; int main() { std::ifstream File("test.dat"); if(!File) { std::cerr << "Failed to open test.dat" << std::endl; return 0; } double x, y; while(File >> x) { File.ignore(1024, ','); File >> y; X.push_back(x); Y.push_back(y); } for(std::vector<double>::size_type idx = 0; idx < X.size(); idx ++) std::cout << std::setw(3) << idx << ": " << X[idx] << " " << Y[idx] << std::endl; } -- Absolutely not the best homepage on the net: http://home20.inet.tele.dk/midgaard But it's mine - Bertel
Jan 29 2006
In article <drjj8o$vuk$1 digitaldaemon.com>, Bertel Brander says...rvw wrote:Bertel, Much thanks! I would have had a lot of trouble with memory allocation. And I was going to implement the functionality of STRTOK() from scratch! I will post my cubic-spline program after I have completed it. Thanks again! rvwI am writing a command-line C program to perform cubic-pline interpolation on large data files. Each line of the ASCII files will have: x-value,y-value. The values will be converted to long doubles via _atold and then put into separate x-arrays and y-arrays. I can probably eventually write code to properly input the data, but I am hoping someone already has a solid routine for doing it.You could use: #include <stdio.h> #include <stdlib.h> #include <string.h> double *X, *Y; int main() { FILE *f = fopen("test.dat", "rt"); char Line[256]; unsigned int AllocSize = 0, Size = 0, n; if(!f) { fprintf(stderr, "Failed to open test.dat"); return EXIT_FAILURE; } while(fgets(Line, sizeof(Line), f)) { char *s = strtok(Line, ", "); if(s) { double x = strtod(s, 0); if((s = strtok(0, ",")) != 0) { double y = strtod(s, 0); if(Size >= AllocSize) { AllocSize += 128; X = realloc(X, AllocSize*sizeof(double)); Y = realloc(Y, AllocSize*sizeof(double)); } X[Size] = x; Y[Size] = y; Size++; } else { fprintf(stderr, "Wrong line in input"); } } else { fprintf(stderr, "Wrong line in input"); } } for(n = 0; n < Size; n++) { printf("%3u: %f %f\n", n, X[n], Y[n]); } free(X); free(Y); return EXIT_SUCCESS; } I C++ is an option it would be a lot easyer to do it with ifstream and a vector -- Absolutely not the best homepage on the net: http://home20.inet.tele.dk/midgaard But it's mine - Bertel
Jan 30 2006