我的程序应该从 .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
最佳答案
The program currently works
不,不是!
您的 addTen
函数具有未定义的行为。它正在从未初始化的数组输出值。如果它对您“有效”,那可能是因为它恰好与您在丢弃之前在 loadTextFile
中填充的局部变量 numberArray
位于堆栈的同一部分。你根本不能依赖这个。
我建议您将数组传递到函数中:
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"
),加载数据并关闭它。然后打开写入并输出修改后的数据。
关于c - 需要帮助解决 fscanf 和 fprintf 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401438/