C-如何将链表指针内容写入文本文件
我有一个程序,它有一个指针数组,例如:C-如何将链表指针内容写入文本文件,c,C,我有一个程序,它有一个指针数组,例如: INTLIST* myArray[countOfRows]; 每个myArray指针都指向一个链表,基本上它变成了一个M*N矩阵 例如: 3 2 1 2 1 0 1 9 8 所以myArray[0]是一个带有3->2->1的链表,myArray[1]是一个带有2->1->0..的链表。我有一个打印矩阵的函数,基本上是这样做的: for(int i = 0; i<countOfRows; i++) list_print(myArray[i])
INTLIST* myArray[countOfRows];
每个myArray
指针都指向一个链表,基本上它变成了一个M*N矩阵
例如:
3 2 1
2 1 0
1 9 8
所以myArray[0]
是一个带有3->2->1
的链表,myArray[1]
是一个带有2->1->0..
的链表。我有一个打印矩阵的函数,基本上是这样做的:
for(int i = 0; i<countOfRows; i++)
list_print(myArray[i]);
这一切都是伟大的,工作良好,(我知道我可以优化和清理,我保证这样做)。现在我的下一个问题是我需要把这个矩阵写成一个文本文件。所以我试了一下:
char* outputFileName = "out.txt";
FILE* ofp;
ofp=fopen(outputFileName, "w");
if(ofp == NULL)
{
printf("Cannot open writeable file!");
return -1;
}
for(i=0; i<fileLineCount; i++)
{
fprintf(ofp, list_print(aList[i]);
}
char*outputFileName=“out.txt”;
文件*ofp;
ofp=fopen(输出文件名,“w”);
如果(ofp==NULL)
{
printf(“无法打开可写文件!”);
返回-1;
}
对于(i=0;i您不能使用printf
函数写入文件。您需要将所有printf
调用替换为fprintf
并传递文件
指针
您可以更改列表\u print
以接受文件*
,以便将数据写入文件。根据此方案:
void list_print(FILE* fp, INTLIST* list)
{
/* ... rest of your code */
fprintf(fp, "%d ", temp->datum);
/* ... rest of your code */
}
list\u print
需要使用fprintf
,否则它的输出将进入标准输出,而不是文件
这意味着您需要将ofp
作为参数传递到list\u print
另外,fprintf(…,list_print())也没有意义,因为list_不返回任何内容。
只需在该循环中调用list\u print。您正在尝试打印list\u print()的结果,该结果无效
您需要编写一个新版本的list_print函数,它接受一个文件*和一个列表,并将那里的printf
替换为fprintf
要保存公共代码,可以通过以下方式复制原始代码:
void list_fprint (FILE * out, INTLIST * list) {
. . . // as described above
}
void list_print (INTLIST * list) {
list_fprint(stdout, list);
}
对于您的list\u print
功能,我可以做几件事:
- 传递一个
文件*
变量,以便指定文件的存放位置
- 不要将
temp
初始化为NULL
,因为您还是在for
语句中设置了它
这会给你一些类似的东西:
void list_print(FILE *fOut, INTLIST* list) {
INTLIST *temp;
for (temp = list; temp != NULL; temp = temp->next)
fprintf (fOut, "%d ", temp->datum);
fprintf (fOut, "\n");
}
要使用它打印到标准输出,只需使用:
list_print (stdout, list);
由于标准输出的stdout
只是一个文件*
(如果愿意,也可以使用stderr
)。如果要将其写入文件:
FILE *fp = fopen ("output_file.txt", "w");
if (fp == NULL) {
// Flag an error.
} else {
list_print (fp, list);
fclose (fp);
}
当特定列表不为空时,您还可以进行更改,以消除每行末尾的多余空格。此时,列表(1,2,3)将打印为(字符为空格):
如果将功能更改为:
void list_print(FILE *fOut, INTLIST* list) {
INTLIST *temp;
char *sep = "";
for (temp = list; temp != NULL; temp = temp->next) {
fprintf (fOut, "%s%d", sep, temp->datum);
sep = " ";
}
fprintf (fOut, "\n");
}
它将在结尾处消除多余的空间。这是否真的有必要是您自己的决定-我经常这样做是为了有一个特定的输出格式,而不会使代码变得太难看,但很可能结尾处的空间不会给您带来任何麻烦。在中使用fprintf
函数e> 使用文件*
参数列出打印功能,如示例所示:
void list_print(INTLIST* list, FILE *fp)
{ /* This function simply prints the linked list out */
INTLIST* temp=NULL; //temp pointer to head of list
/* loops through each node of list printing its datum value */
for(temp=list; temp!=NULL; temp=temp->;next)
{
fprintf(fp, "%d ", temp->datum); //print datum value
}
fprintf(fp, "\n");
}
将这样做:
int main(){
FILE *fp;
fp = fopen("data.txt", "w");
for(i=0; i<fileLineCount; i++)
{
list_print(alist[i], fp);
}
fclose(fp);
}
intmain(){
文件*fp;
fp=fopen(“data.txt”,“w”);
对于(i=0;i)您仍然可以通过调用list_print(stdout,thelist)而不是list_print(thelist),轻松地模拟此函数的旧行为.+1到所有我知道printf不会写入文本文件,但+1到所有这不是一个链表,而是一个指针列表。在链表中,每个元素都包含一个指向下一个元素的指针。随机建议:一旦启用文件的版本工作到您满意的程度,请将标准输出版本切换到只调用该文件的包装器使用stdout
的版本。这将使您只需维护该代码的一个副本。这里的原则是:不要重复自己!@gary:The是一系列问题中的第n个INTLIST
类型是一个链表。@tommieb,如果二进制转储中的这些文件包含内存地址(用于链接),当重新阅读时,它们几乎肯定是无效的。@paxdiablo:没错,是的,我确实考虑过在写答案时…感谢您的输入…将修改答案以突出您的观点。。。
void list_print(INTLIST* list, FILE *fp)
{ /* This function simply prints the linked list out */
INTLIST* temp=NULL; //temp pointer to head of list
/* loops through each node of list printing its datum value */
for(temp=list; temp!=NULL; temp=temp->;next)
{
fprintf(fp, "%d ", temp->datum); //print datum value
}
fprintf(fp, "\n");
}
int main(){
FILE *fp;
fp = fopen("data.txt", "w");
for(i=0; i<fileLineCount; i++)
{
list_print(alist[i], fp);
}
fclose(fp);
}
for(i=0; i<fileLineCount; i++)
{
fwrite(alist[i], sizeof(alist[i]), 1, ofp);
}
for(i=0; i<fileLineCount; i++)
{
fread(&alist[i], sizeof(alist[i]), 1, ofp);
}