写入C中的文件

时间:2017-08-01 14:04:58

标签: c file io

我想使用内存分配将字符串写入FILE,我希望流接受输入尽可能多。为了做到这一点,在用户按下 Ctrl - Z 之前,字符数组会越来越大。

但我的代码无法正常工作,我不知道为什么!

这是我的代码:

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

 int main(void)
 {
   size_t index=0, newsize=0;//are used for reallocating
   int ctrl=1;//Primary value for CTRL for going through while loop
   char *sentence , singlechar;
    sentence=(char*)malloc(1*sizeof(char));

    FILE *fptr;
    fptr=fopen("E:\\Textsample.txt","w");
    if(fptr==NULL)
    {
        free(fptr);
        puts("Error occurs when trying to allocate memory.");
        exit(EXIT_FAILURE);
    }

    singlechar=getchar();
    sentence[index]=singlechar;

    while((ctrl=getchar())!=EOF)
        {
            /**Making sentence bigger**/
            newsize++;
            realloc(sentence,newsize);
            if(sentence==NULL)
            {
                free(sentence);
                puts("Error occurs when trying to reallocate memory.");
                exit(EXIT_FAILURE);
            }

            /**Putting inputed character into sentence**/
            index++;
            singlechar=(char) ctrl;

            /*Check if it is EOF*/
            if((int) ctrl==EOF)
            {
                free(sentence);
                puts("EOF Reached.");
                exit(EXIT_SUCCESS);
            }
            else
            {
                sentence[index]=singlechar;
                fwrite(sentence,sizeof sentence[0],newsize,fptr);
            }
      }

        free(fptr);
        return EXIT_SUCCESS;
    }

我感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这里的想法是错误的。您提出的方法是浪费CPU和内存alloc / realloc。这里的问题是 <View pointerEvents={'none'}> <Image pointerEvents={'none'} style={{ position: 'absolute', bottom: 0, left: 0, right: 0, height: 100, opacity: 0.8 }} source={require('Project/assets/1.0/Screen1.0.2/bottom-gradient.png')} /> </View> 。此调用是源字节的realloc(sentence, 1);线性副本。每次输入某个字符时逐个添加字节会使您的总分配过程O(n) 更差

什么阻止我使用你的技术只是继续输入并运行你的系统内存?

此外,最佳做法是分配一个基本数组(比方说128个字节?)并使其以指数方式增长。

哦,并且,没有投出O(n^2)电话的结果。这是非常难看的代码和无用的。

我会建议像

这样的东西
malloc

答案 1 :(得分:0)

你现在正在做什么(除了在NULL指针和文件描述符上调用free之外 - 不做其中任何一个)是按字符读取输入,将它存储在一个数组中(每次调整大小时都会调整它)大小1 - 我猜你的意思是索引+ 1,这仍然是非常低效的)并将第一个字符写入文件。

我没有运行代码,但我看到SEGFAULT至少有3个点,如上所述。

你要做什么,是读取缓冲区的输入(任意大小的数组,在这种情况下根本不需要调整大小),一旦缓冲区满了或你点击EOF - 写入文件并将索引重置为0.