将数组保存到文件将无法正常工作,程序崩溃

时间:2014-02-21 12:31:17

标签: c arrays fopen fwrite

我几天前已经发布了关于我的阵列程序的问题。好吧,它基本上是一个程序,它允许用户生成一个数组,安全特定插槽中的特定数字,读取数组或读取特定的插槽值。现在我正在搞清楚,如何让用户将当前数组保存为文件。

这就是我得到的

void safeFile(){
    FILE *f = fopen("list.txt", "a+");
    putc(f , list);
    fclose(f);
    printf("File saved");
    start();
    }

问题出在哪里?

每次调用函数safeFile()时,我的程序都会崩溃。

我玩了,带有fput而不是putc,程序不会再崩溃,文件被创建但是它仍然是空白

void safeFile(){
    FILE *f = fopen("list.txt", "r+");
    fputs(f , list);
    fclose(f);
    printf("File saved");
    start();
    }

这是我目前的完整代码

非常感谢建议,即新手

#include <stdio.h>
#include <stdlib.h>

int list[30];
int x = 0;
int i = 0; // variable used by for-Loop in setList
int j = 0; // variable used by for-Loop in getList
int input;
int option; //start Value
int gvinput; //getValue input
void start();
void getList();

int main()
{
    start();
    return 0;
}

void setList(int sizeOfList)
{
    for (i = x; i <= sizeOfList; i++)
    {

        list[i] = i;

    }

}
void getList(){
    for(j = x; j < i ; j++ )
    {
        printf("At %d we got the value %d \n",j,list[j]);
    }
}

void startList()
{
    fflush(stdin);
    printf("Please enter number between 0 and 30\n ");
    scanf("%d",&input);
    if(input > 30 || input == 0)
    {
        printf("The Number is not between 0 and 30\n");
        startList();
    }
    setList(input);
    getList();
    fflush(stdin);
    start();
}

void setValues(int l[])
{
    fflush(stdin);
    int v;
    int loc;
    printf("please enter what value you want to safe\n");
    scanf("%d",&v);
    fflush(stdin);
    printf("Where do you want to save it?\n");
    scanf("%d",&loc);
    l[loc] = v;
    printf("we got at slot %d the value %d\n\n",loc,l[loc]);
    start();
}

void getValues(int getArray[]){

fflush(stdin);

printf("which slot do you want to read?\n");
scanf("%d",&gvinput);
fflush(stdin);
printf("The value is: %d \n\n",getArray[gvinput]);
start();
}
void safeFile(){
    FILE *f = fopen("list.txt", "r+");
    fputs(f , list);
    fclose(f);
    printf("File saved");
    start();
    }

void start(){
    fflush(stdin);
    printf("\n");
    printf("[L] = generate Slots\n");
    printf("[S] = set a Value at specific slot\n");
    printf("[G] = get a Value from a specific slot\n");
    printf("[F] = safe File");
    printf("[X] = exit\n");

    option=getchar();
    if(option == 'L' || option == 'l'){
        startList();
    }
    if(option == 'S' ||option == 's'){
        setValues(list);
    }
    if (option =='G' ||option == 'g'){
        getValues(list);
     }
     if (option == 'X' || option == 'x'){
        printf("Thank you");
     }
     if (option == 'f' || option == 'F'){
        safeFile();
     }

4 个答案:

答案 0 :(得分:1)

int putc( int ch, std::FILE* stream );

putc会写一个char,并将int的数组传递给它。 fputs也是如此,它写了一个以空字符结尾的字符串。你真的必须编写一些序列化你的数据结构的代码到一个要写入文件的字节序列。

在您的情况下,由于您要保存int的列表,您可以使用循环执行此操作,例如,循环遍历数组并将每个项目写入文件。你还需要一个写int的函数(putc在这里不好,因为它写了char)。如果您想坚持使用C风格的IO,请查看printf,否则请使用streams

答案 1 :(得分:0)

如果你使用putc(),你应该通过char传递char。

for(i=0;i<strlen(list);i++)
{
  putc(f,list[i]);
}

列表是一个数组,如果你传递地址就意味着整个数组,所以putc在这里不起作用。

答案 2 :(得分:0)

int fputs(const char *s, FILE *stream);

fputs的第二个参数是流。因为你使用int [10]。你可以使用fprintf打印到文件。

此外,fflush(stdin);是未定义的行为

答案 3 :(得分:0)

你需要使用循环,但它不起作用,因为putc函数中的参数输入顺序不正确。试试这个:

for(i=0;i<strlen(list);i++)
{
  putc(list[i],f); //<---------- NOT putc(f,list[i]);
}

首先是char,然后是流。

int putc ( int character, FILE * stream );