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);
}