我的程序应该从.txt文件中读取4个数字,将10个数字加起来,然后再打印回去。我有一个函数,用四个数字加载文本文件,然后另一个函数加10并追加文件。该程序当前可以正常工作,但是我在addTen()函数中感到非常困惑。
为什么我不需要再次fscanf文件?我的函数如何才能知道.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
答案 0 :(得分:2)
该程序当前有效
不,不是!
您的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"
),然后加载数据并关闭它。然后打开它进行写入并输出修改后的数据。
答案 1 :(得分:0)
结果证明我确实需要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
答案 2 :(得分:-1)
您的loadTextFile(FILE * file)有一个包含4个整数的数组。它不是从文件中读取数字,而是在文件中写入数字。它具有以下数组:int numberArray [4] = {56,23,89,30};
要读取文件,您需要使用fscanf()