b*********n 发帖数: 1258 | 1 Ansi C in Unix
我现在有一个struct要存储一些数字
但是有多少个数字是不确定的
需要程序的运行结果来确定
我要把这些数字save到一个file里面
然后另一个程序去open这个file
但是我不知道在存储那个struct的时候
怎么解决未知数目的问题
大家提点建议吧 |
g*****g 发帖数: 34805 | 2 use a pointer void*, and malloc at runtime.
【在 b*********n 的大作中提到】 : Ansi C in Unix : 我现在有一个struct要存储一些数字 : 但是有多少个数字是不确定的 : 需要程序的运行结果来确定 : 我要把这些数字save到一个file里面 : 然后另一个程序去open这个file : 但是我不知道在存储那个struct的时候 : 怎么解决未知数目的问题 : 大家提点建议吧
|
b*********n 发帖数: 1258 | 3 那第二个文件去打开这个文件的时候
怎么知道里面有多少个数字呢?
【在 g*****g 的大作中提到】 : use a pointer void*, and malloc at runtime.
|
g*****g 发帖数: 34805 | 4 If you are going to write out and read in again, it's even simpler.
Just write the number of numbers or sizeof(struct) into the file first.
【在 b*********n 的大作中提到】 : 那第二个文件去打开这个文件的时候 : 怎么知道里面有多少个数字呢?
|
b*********n 发帖数: 1258 | 5 如果我把sizeof(struct)先写进去的话
reader program 怎么知道里面有多少个数字?
还是需要write out 那个occurrence number.
有什么方法可以避免那个occurrence number吗?
【在 g*****g 的大作中提到】 : If you are going to write out and read in again, it's even simpler. : Just write the number of numbers or sizeof(struct) into the file first.
|
c********e 发帖数: 383 | 6 我今天和乐点酒,头脑不是很清楚,凑合看吧。
struct Array
{
unsigned long length_;
int * data_
explicit Array ( const int num) : length_ (num)
{ data = static_castmalloc (sizeof(int)*length);}
~Array (void) {delete data_;}
void init (...) {//initialize ur arrary of int}
int operator [] (int i) { //check boundary maybe; return data[i]; }
private: //or protected
const A& operator=(const A&);
A(const &);
};
或者用vector得乐。要不自己写个templated struct. 还可以用new 来代替malloc.
或者overlaod operator new,或者用allocat
【在 b*********n 的大作中提到】 : 如果我把sizeof(struct)先写进去的话 : reader program 怎么知道里面有多少个数字? : 还是需要write out 那个occurrence number. : 有什么方法可以避免那个occurrence number吗?
|
g*****g 发帖数: 34805 | 7 You drink too much, you can't do this in C.
【在 c********e 的大作中提到】 : 我今天和乐点酒,头脑不是很清楚,凑合看吧。 : struct Array : { : unsigned long length_; : int * data_ : explicit Array ( const int num) : length_ (num) : { data = static_castmalloc (sizeof(int)*length);} : ~Array (void) {delete data_;} : void init (...) {//initialize ur arrary of int} : int operator [] (int i) { //check boundary maybe; return data[i]; }
|
c********e 发帖数: 383 | 8 由没说非得用c
哈哈,walking in the cloud ah , 酒就是好,一醉万事休
first.
【在 g*****g 的大作中提到】 : You drink too much, you can't do this in C.
|
l*********o 发帖数: 3091 | 9 楼主一上来就说ANSI C
【在 c********e 的大作中提到】 : 由没说非得用c : 哈哈,walking in the cloud ah , 酒就是好,一醉万事休 : : first.
|
e***i 发帖数: 231 | 10 文件大小不是可以知道吗?
http://stackoverflow.com/questions/8236/how-do-you-determine-th
【在 b*********n 的大作中提到】 : 那第二个文件去打开这个文件的时候 : 怎么知道里面有多少个数字呢?
|
|
|
n******n 发帖数: 12088 | 11 又是女生来问作业?
【在 b*********n 的大作中提到】 : Ansi C in Unix : 我现在有一个struct要存储一些数字 : 但是有多少个数字是不确定的 : 需要程序的运行结果来确定 : 我要把这些数字save到一个file里面 : 然后另一个程序去open这个file : 但是我不知道在存储那个struct的时候 : 怎么解决未知数目的问题 : 大家提点建议吧
|
w***g 发帖数: 5958 | 12 struct Numbers {
size_t N;
float data[1]; /* 有的编译器要求数组长度至少为1 */
};
写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file);
读的时候先把N读出来,然后
xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float)
);
然后xx里的data就可以当N个元素的素组用了。
【在 b*********n 的大作中提到】 : Ansi C in Unix : 我现在有一个struct要存储一些数字 : 但是有多少个数字是不确定的 : 需要程序的运行结果来确定 : 我要把这些数字save到一个file里面 : 然后另一个程序去open这个file : 但是我不知道在存储那个struct的时候 : 怎么解决未知数目的问题 : 大家提点建议吧
|
n******n 发帖数: 12088 | 13 直接float*不就完了?
float)
【在 w***g 的大作中提到】 : struct Numbers { : size_t N; : float data[1]; /* 有的编译器要求数组长度至少为1 */ : }; : 写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file); : 读的时候先把N读出来,然后 : xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float) : ); : 然后xx里的data就可以当N个元素的素组用了。
|
k***5 发帖数: 583 | 14 2 step:
1. Saving as structure {int count; float []} to file
2. When read, you know the size of file, simply read the whole file to
buffer, the first 4 bytes is the count, then covert the rest of buffer to
knowing size array. |
d****i 发帖数: 4809 | 15 这个应该是用指针来定义动态数组吧,如下
struct Numbers {
size_t N;
float *data;
};
struct Numbers numbers;
//read N in
scanf("%d", &numbers.N);
//create the new data array based on N
number.data = malloc(sizeof(float)*N);
//read data in
for(int i=0; i
fscanf(pFile, "%f", &number.data[i]);
}
float)
【在 w***g 的大作中提到】 : struct Numbers { : size_t N; : float data[1]; /* 有的编译器要求数组长度至少为1 */ : }; : 写的时候先把N写进去,然后fwrite(xx.data, sizeof(float), xx.N, file); : 读的时候先把N读出来,然后 : xx = (struct Numbers *)malloc(sizeof(struct Numbers) + (N-1) * sizeof(float) : ); : 然后xx里的data就可以当N个元素的素组用了。
|
n*****3 发帖数: 1584 | 16 。恨就不用啦,
Linux 里 这种trick很多
【在 d****i 的大作中提到】 : 这个应该是用指针来定义动态数组吧,如下 : struct Numbers { : size_t N; : float *data; : }; : struct Numbers numbers; : //read N in : scanf("%d", &numbers.N); : //create the new data array based on N : number.data = malloc(sizeof(float)*N);
|
x****u 发帖数: 12955 | |
n******n 发帖数: 12088 | 18 日。谁挖出来的
【在 x****u 的大作中提到】 : 十年的老坑啊
|
g*****g 发帖数: 34805 | 19 不知道,看似我十年前C还是很好的,现在完全不会了。
【在 n******n 的大作中提到】 : 日。谁挖出来的
|
x****o 发帖数: 21566 | |
z**********r 发帖数: 86 | 21 我是这么用的(verified on Ubuntu):
typedef struct
{
// fixed length data
int len;
// any varying length data should be put below
// note, you must be used data[] instead of *data
// because data[] does't take extra space; *data takes four bytes for the
pointer
char data[];
}Array;
// for allocate
int len=10;
Array *x=(Array *)malloc(len*sizeof(char)+sizeof(Array));
x->len=10;
// access the varying length part
x->data[0]='c';
// for deallocate
free(x); |
A*******e 发帖数: 2419 | 22 这么用错的厉害。你只能把Array放在堆里。我想声明一个Array类型的局部变量怎么办
?而且可读性很差。
验证一个例子能说明什么问题?楼上用指针才是正解。
【在 z**********r 的大作中提到】 : 我是这么用的(verified on Ubuntu): : typedef struct : { : // fixed length data : int len; : // any varying length data should be put below : // note, you must be used data[] instead of *data : // because data[] does't take extra space; *data takes four bytes for the : pointer : char data[];
|