分享
三行代码  ›  专栏  ›  技术社区  ›  Arthur Green

需要帮助解决fscanf和fprintf问题

  •  0
  • Arthur Green  · 技术社区  · 11 月前

    我的程序应该从一个.txt文件中读取4个数字,在数字上加10,然后再打印回来。我有一个函数,它用四个数字加载文本文件,然后另一个函数添加10并附加文件。这个程序目前可以工作,但是在addten()函数中我很困惑。

    为什么我不需要再次扫描文件?我的函数如何知道保存在.txt文件中的值?当我试图让我的程序使用EOF指示器时,我意外地发现了这一点。

    #include <stdio.h>
    
    // function prototypes
    void loadTextFile(FILE *file);
    void addTen(FILE *file);
    
    // begin main function
    int main(void){
    
        FILE *text = fopen("question6.txt","w");
    
        if(text == NULL)
        {
            printf("question6.dat cannot be opened!\n");
            fprintf(stderr, "Error opening the fil!\n");
        }
    
        else
            printf("\nquestion6.dat was opened successfully for Writing.\n\n");
    
        loadTextFile(text);
        addTen(text);
    
        fclose(text);
    
        return 0;
    } // end main function
    
    
    void addTen(FILE *file){
    
        int i=0;
        int number[4];
    
        for (i=0;i<4;i++)
        {   
            fprintf(file, "%d\n", number[i]+10);
            printf("\n\t%d was written to the file\n", number[i]+10);
        }
    
    } 
    
    // function to load the .txt file with array values so we may execute main on any computer. 
    void loadTextFile(FILE *file){
    
    
        int numberArray[4]={56, 23, 89, 30};
    
        int i=0;
    
        for(i=0;i<4;i++)
        {
            fprintf(file, "%d\n", numberArray[i]);
            printf("\n\t%d was written to the file\n", numberArray[i]);
    
        }
    
        printf("\nThe data was successfully written\n");
    
    } // end function loadTextFile
    
    3 回复  |  直到 11 月前
        1
  •  2
  •   paddy    11 月前

    该程序当前有效

    不,它没有!

    你的 addTen 函数具有 未定义的行为 .它正在从未初始化的数组中输出值。如果它对您“有效”,那可能是因为它恰好与局部变量位于堆栈的同一部分。 numberArray 你所填写的 loadTextFile 丢弃之前。你不能依赖这个 完全 .

    我建议您将数组传递到函数中:

    void addTen(int array[], int size) {
        for (int i=0; i < size; i++) {   
            array[i] += 10;
        }
    }
    
    void loadTextFile(FILE *file, int array[], int size) {
        for (int i=0; i < size; i++) {   
            fscanf(file, "%d", &array[i]);
        }
    }
    

    可能还有一个单独的函数来打印数据:

    void printArray(FILE* fp, int array[], int size) {
        for (int i=0; i < size; i++) {   
            fprintf("%d\n", array[i]);
        }
    }
    

    现在全部调用:

    int array[4];
    loadTextFile(text, array, 4);
    addTen(array, 4);
    printArray(text, array, 4);
    

    请注意,您的程序框架中还有一些其他错误。一个问题是您正在用openmode打开输入文件 "w" ,它将只打开文件进行写操作,并截断其当前内容。

    打开它阅读可能更好( "r" )首先,加载数据并关闭它。然后打开它进行写入并输出修改后的数据。

        2
  •  0
  •   Arthur Green    11 月前

    结果发现我确实需要一个fscanf,我工作的唯一原因是因为我很幸运!在@paddy和其他评论员的帮助下,我解决了这个问题。我还用预先加载带有特定数字的文本文件的想法解决了这个程序。下面的代码是问题中发布的代码的改进版本,将作为解决此问题的解决方案。

    //Program which reads four numbers from a text document, adds 10 to them and appends them back to the text file
    
    #include <stdio.h>
    
    // function prototypes
    void loadTextFile(FILE *file, int array[], int size);
    void printArray(FILE* fp, int array[], int size);
    void addTen(int array[], int size);
    
    // begin main function
    int main(void){
    
        FILE *text = fopen("question6.txt","r"); // open the file to read it
    
        int array[4]; 
    
        loadTextFile(text, array, 4); // scan the .txt file into an array
        addTen(array, 4);   // add ten to each number in the array
    
        fclose(text); // close the file for writing
    
        fopen("question6.txt","a"); // open the file to append it
    
        printArray(text, array, 4); // print the array to the file
    
        fclose(text); // close the file after appending. 
    
        return 0;
    } // end main function
    
    
    void loadTextFile(FILE *file, int array[], int size) {
        int i=0;
        for (i=0; i < size; i++) {   
            fscanf(file, "%d", &array[i]);
        }
    }
    
    void addTen(int array[], int size) {
        int i=0;
        for (i=0; i < size; i++) {   
            array[i] += 10;
        }
    }
    
    void printArray(FILE* fp, int array[], int size) {
        int i=0;
        for (i=0; i < size; i++) {   
            fprintf(fp, "%d\n", array[i]);
            printf( "%d was written to the array.\n", array[i]);
        }
    }
    

    我还通过将指针指向文件的开头,使我最初的想法得以实现。只使用fopen打开文件一次,指针就一直在文件的末尾。

    #include <stdio.h>
    
    // function prototypes
    
    void loadTextFile(FILE *file);
    
    void returnStats(FILE *file);
    
    // begin main function
    
    int main(void){
    
    FILE *text = fopen("question6.txt","w");
    
    if(text == NULL)
    
    {
    
    printf("question6.dat cannot be opened!\n");
    
    fprintf(stderr, "Error opening the fil!\n");
    
    }
    
    else
    
    printf("\nquestion6.dat was opened successfully for Writing.\n\n");
    
    loadTextFile(text);
    fclose(text);
    FILE *text1 = fopen("question6.txt","r");
    
    returnStats(text1);
    
    
    return 0;
    
    } // end main function
    
    void returnStats(FILE *file){
    
    int i=0, count;
    
    int number[4];
    
    
    while(fscanf(file, "%d", &number[i++])!=EOF){
    
    printf("\n%d : Was Read from the File\n", number[i-1]);
    count++;
    
    }
    fclose(file);
    FILE *text1 = fopen("question6.txt","a");
    for(i=0;i<count-1;i++){
        fprintf(text1, "%d\n", number[i]+10);
        printf("\n%d: was appended to the text file\n", number[i]+10);
    }
    } // end returnStats
    
    // function to load the .txt file with array values so we may execute main on any computer.
    
    void loadTextFile(FILE *file){
    
    int numberArray[4]={56, 23, 89, 30};
    
    int i=0;
    
    for(i=0;i<4;i++)
    
    {
    
    fprintf(file, "%d\n", numberArray[i]);
    
    printf("\n%d : was written to the file\n", numberArray[i]);
    
    }
    
    printf("\nThe data was successfully written\n");
    
    } // end function loadTextFile
    
        3
  •  -1
  •   skyCode    11 月前

    您的loadtextfile(file*file)有一个包含4个整数的数组。它不是从文件中读取数字,而是向文件中写入数字。它有这个数组:int numberArray[4]=56、23、89、30_

    要读取文件,需要使用fscanf()。